Generated by All in One SEO v4.9.10, this is an llms.txt file, used by LLMs to index the site. # RUPUG Education Center Создавая будущее, делимся знаниями! ## Sitemaps - [XML Sitemap](https://rupug.pro/sitemap.xml): Contains all public & indexable URLs for this website. ## Записи - [Блог](https://rupug.pro/blog/) - [Как интерпретировать runtime-метрики в PAS for OpenEdge](https://rupug.pro/runtime-metrics-pas-for-openedge/) - Что означает maxReserveABLSessionWaitTime? Хорошая тема для разбора! Давайте разберём эту метрику – она действительно помогает ловить узкие места. Эта метрика показывает максимальное время, которое какая-либо ABL-сессия провела в очереди, ожидая освобождения ресурса (то есть пока система резервировала для неё сессию). Проще говоря: запрос пришёл, но сразу выполнить его не получилось – пришлось подождать, пока освободится - [Как настроить maxConnectionsPerAgent и maxABLSessionsPerAgent для экземпляра PASOE](https://rupug.pro/pas-tuning-maxconnectionsperagent-and-maxablsessionsperagent/) - Параметры задаются в файле {CATALINA_BASE}\config\openedge.properties. Их можно указать: Глобально — в секции [AppServer.Agent]. Тогда настройки применятся ко всем агентам. Для конкретного экземпляра — в отдельной секции, например [AppServer.SessMgr.oepas1]. Это приоритетнее глобальных настроек. Пример фрагмента openedge.properties: [AppServer.Agent] maxConnectionsPerAgent=20 maxABLSessionsPerAgent=100 # Либо для конкретного агента: [AppServer.SessMgr.oepas1] maxConnectionsPerAgent=30 maxABLSessionsPerAgent=90 Как работают эти параметры maxConnectionsPerAgent Это лимит одновременных запросов (сессий-подключений), которые MS-Agent может - [О прекращении поддержки 32-битных систем Windows в OpenEdge](https://rupug.pro/end-of-32-bit-windows-support-in-openedge/) - О прекращении поддержки 32-битных систем Windows в OpenEdge. Рекомендуется перейти на 64‑битную ОС для стабильности и производительности. - [Developer Studio for OpenEdge добавление в инсталляцию](https://rupug.pro/adding-progress-developer-studio-for-openedge/) - Инструкция по установке Progress Developer Studio for OpenEdge содержит последовательность действий для обеспечения корректной инсталляции. - [OpenEdge 12.8.11+ и поддержка алгоритма кодирования OECH1](https://rupug.pro/12-8-11-oech1-incremental-migration-option/) - В версиях системы OpenEdge 12.8.11+ и 12.2.19+ прекращена поддержка алгоритма кодирования OECH1. Эти изменения необходимы для устранения известной уязвимости. - [Перенос параметров старта баз данных из OpenEdge Management 11.7 в OpenEdge Management 12.8](https://rupug.pro/how-to-import-configuration-into-new-installation/) - В OpenEdge 11.7 появилась утилита configutil, предназначенная для миграции файлов свойств между различными версиями OpenEdge. Здесь приведен пошаговый алгоритм. - [Table Partitioning: доступ к данным секционированных таблиц](https://rupug.pro/table-partitioning-access-to-data/) - Статья описывает, как модифицировать ABL-код для работы с секционированными таблицами (Table Partitioning) в OpenEdge. Даются рекомендации по оптимизации. - [Обзор OpenEdge Table Partitioning](https://rupug.pro/openedge-table-partitioning-overview/) - Table Partitioning (Табличное секционирование) - позволяет эффективно организовывать хранение пользовательских данных, увеличивая скорость доступа к ним и снижая совокупные эксплуатационные расходы. - [OpenEdge: как выбрать таблицу для Table Partitioning?](https://rupug.pro/openedge-table-partitioning-how-to-select-table/) - Решили опробовать Table Partitioning? Но как понять, какие таблицы лучше для этого подойдут? В этой статье даётся несколько советов о том, как сделать выбор. - [Как мы создали CI\CD для депозитарной системы](https://rupug.pro/ci-cd-progress-openedge/) - Автоматизация разработки ПО ускоряет релизы и улучшает качество кода. CI/CD - как эффективное решение для автоматизации разработки. - [Новые поля VST для версий OpenEdge и редакций RDBMS](https://rupug.pro/new-vst-fields-for-openedge-version-and-rdbms-edition/) - В выпуске OpenEdge 12.8 LTS были добавлены новые поля VST, расширяющие функциональность и повышающие точность отслеживания состояния и конфигурации базы данных. - [Усечение области хранения данных в реальном времени](https://rupug.pro/truncate-data-storage-areas/) - Администраторы баз данных могут сталкиваться с необходимостью удаления архивных или уже обработанных данных, которые больше не требуются. Хранение данных в определенной области может приводить к увеличению затрат на вычислительные ресурсы из-за значительного роста объема данных. В связи с этим, администраторам баз данных необходимо оперативно удалять данные в режиме онлайн. До выпуска OpenEdge 12.8 LTS было - [OpenEdge: оптимизация управления и производительности СУБД](https://rupug.pro/key-improvements-in-openedge-12-8-lts-part-1/) - Узнайте о новых функциях для эффективного администрирования и повышения надёжности работы базы данных в OpenEdge 12.8 LTS. - [OpenEdge 12.8 LTS - многопоточные проверки индексов](https://rupug.pro/multi-threaded-index-checks/) - OpenEdge 12.8 LTS — многопоточные проверки индексов для оптимизация процессов восстановления, значительно повышая общую производительность системы. - [Мониторинг PASOE через веб-приложение Tomcat Manager](https://rupug.pro/how-to-monitor-pasoe-instance-via-tomcat-manager/) - Tomcat Manager — мощный инструмент для мониторинга и управления PASOE. В статье рассмотрены ключевые параметры для анализа производительности сервера. - [OpenEdge Replication: инструкция по настройке](https://rupug.pro/instructions-for-setting-up-openedge-replication/) - Настоящая инструкция предоставляет последовательные примеры настройки OpenEdge Replication для создания горячей резервной копии базы данных Progress OpenEdge. - [OpenEdge Replication: создание второй Target-базы с помощью PROBKUP в online](https://rupug.pro/openedge-replication-create-second-target-db-with-probkup-online/) - [Резервное копирование базы данных с использованием усовершенствованного алгоритма сжатия](https://rupug.pro/database-backup-with-zstd-compression/) - Утилита резервного копирования OpenEdge (PROBKUP) получила значительное обновление, которое радикально изменит подход к созданию резервных копий. Теперь PROBKUP обеспечивает мгновенное сжатие данных, позволяя администраторам баз данных значительно сократить занимаемое дисковое пространство и существенно ускорить процесс резервного копирования, как в онлайн, так и в автономном режимах. Благодаря новым возможностям сжатия, вы можете гибко выбирать баланс между - [Мониторинг PAS for OpenEdge](https://rupug.pro/pas-for-openedge-monitoring-for-optimal-performance/) - Узнайте о лучших методах мониторинга PAS for OpenEdge, включая использование REST API, OEJMX и Health Scanner. Повысьте производительность вашей системы. - [Что нового в OpenEdge 12.8 (запись вебинара)](https://rupug.pro/whats-new-in-openedge-12-8/) - На вебинаре рассказывается о ключевых функциях новой версии OpenEdge 12.8 - [Удаление областей хранения в базе данных OpenEdge](https://rupug.pro/deleting-storage-areas-without-stopping-the-database/) - В OpenEdge 12.8 LTS появилась возможность удалять области хранения данных (PROSTRCT REMOVE) без остановки базы данных, что позволяет избежать плановых простоев. Это повышает доступность данных и упрощает управление дисковым пространством. - [Реорганизация больших таблиц в базах данных OpenEdge](https://rupug.pro/reorganize-fragmented-record-data/) - В статье рассмотрен процес реорганизации больших таблиц в OpenEdge с помощью утилиты PROUTIL TABLEREORG в выпуске OpenEdge 12.8 LTS. - [Просмотр информации о наборе символов базы данных](https://rupug.pro/view-database-character-set-information/) - В OpenEdge 12.8 LTS администратор базы данных может легко получить параметры кодировки через инструменты системы управления базами данных. - [Инсталляция OpenEdge RDBMS](https://rupug.pro/installation-openedge-rdbms-part-1/) - Инсталляция OpenEdge: план действий. Узнайте, как правильно подготовиться к инсталляции, учитывая необходимые аппаратные и программные условия. - [Сбор диагностических данных](https://rupug.pro/diagnostic-data-collection/) - Устранения неполадок с помощью сбора диагностических данных OpenEdge от ~bashkat на RUTUBE Сбор диагностических данных позволяет сохранять ценную информацию при возникновении определённых событий. Эти данные могут быть использованы для анализа причин события. Практически все аспекты данной функции настраиваются, включая выбор событий для сбора данных, объём собираемых данных и формат их представления. События Сбор диагностических данных - [Что происходит при отключении пользователя](https://rupug.pro/what-happens-when-a-user-disconnects/) - При завершении пользовательского сеанса работы с базой данных инициируется последовательность операций, которая должна быть выполнена до полного выхода из системы. Данный процесс является критическим для корректного завершения сессии и не допускает прерываний. Для более точного понимания механизма завершения работы с системой рассмотрим основные этапы этого процесса. При получении клиентским терминалом сигнала завершения работы, такого как - [Вредные привычки при администрировании баз данных](https://rupug.pro/bad-habits-in-database-administration/) - В данной статье некоторые распространённые практики администраторов баз данных (БД) классифицируются как «вредные». Это может показаться необычным, однако, учитывая критическую значимость большинства данных и потенциальные последствия их утраты или повреждения, становится очевидным, что подобные привычки действительно представляют угрозу. К сожалению, такие практики широко распространены среди администраторов БД, но, следуя определённым рекомендациям, от них можно избавиться. - [Кто удалил запись из таблицы?](https://rupug.pro/who-deleted-the-record-from-the-table/) - В качестве дополнительного аргумента в пользу использования механизма After-Imaging, рассмотрим ситуацию, когда в системе не используется OpenEdge Auditing и приложение не создаёт собственные журналы аудита. В таком случае, как можно определить, кто и когда удалил конкретную запись из таблицы? В этом случае помогут архивы AI-экстентов, если в базе данных реализован механизм After-Imaging. Методика поиска виновного - [Как рассчитать minport / maxport для БД](https://rupug.pro/how-to-calculate-the-minport-maxport-for-a-database/) - Параметры запуска брокера базы данных -minport и -maxport предназначены для определения отдельного диапазона TCP-портов, доступных для каждого экземпляра брокера базы данных. Это позволяет назначать порты серверам удаленных клиентов в архитектуре клиент-сервер. Когда пользователь подключается к удалённому серверу через логин-брокер, последний создаёт сервер для удалённого соединения на одном из свободных портов в диапазоне от -minport до - [Как узнать, какая ABL программа сейчас работает у пользователя?](https://rupug.pro/which-abl-program-is-currently-running-for-the-user/) - Иногда возникает ситуация, когда необходимо выяснить, какая программа работает у конкретного пользователя в данный момент времени. Особенно это актуально, когда некий процесс сильно загружает систему, и нужно выяснить почему. Обычный звонок пользователю, чтобы узнать, что он запустил, вряд ли поможет, так как либо пользователь не совсем внятно ответит, либо его в это время просто может - [Высокая доступность и отказоустойчивость для приложений OpenEdge](https://rupug.pro/high-availability-and-fault-tolerance-for-openedge-applications/) - Наличие высокодоступного и отказоустойчивого приложения, использующего OpenEdge – это вопрос наличия нескольких компонентов в вашей архитектуре, возможности масштабирования в соответствии с изменяющимися требованиями и нагрузками, а также наличия реплицированных наборов компонентов при сбое частей приложения. Этот тип репликации компонентов и возможностей масштабирования лучше всего работает в облачной или виртуальной среде, где эти инструменты широко распространены - [Устаревание поддержки OpenEdge RDBMS с размером блоков 1024 и 2048 байт](https://rupug.pro/deprecation-of-support-for-database-block-sizes/) - В выпуске OpenEdge 12.8 LTS поддержка баз данных с размером блока 1024 байт и 2048 байт признана устаревшей. Это относится как к созданию новых баз данных, так и к эксплуатации уже существующих. Для определения, затрагивает ли данная проблема вашу систему, необходимо выполнить команду PROUTIL DESCRIBE для получения описания базы данных. В результате выполнения данной команды - [Включение архиватора After-Image экстентов в онлайн](https://rupug.pro/enable-ai-archiver-online/) - Файлы After-Image (AI) содержат информацию о транзакциях, необходимую для их восстановления с применением механизма наката. Эти файлы позволяют восстанавливать базу данных без потери транзакций, выполненных с момента последнего резервного копирования. Архиватор AI автоматизирует управление файлами After-Image, но до выпуска OpenEdge 12.8 LTS для запуска архиватора требовалось предварительное создание резервной копии в онлайн. В версии OpenEdge - [Мониторинг службы After-Image Management Daemon](https://rupug.pro/monitor-the-status-of-after-image-management-daemon/) - В выпуске OpenEdge 12.8 LTS реализована возможность программного мониторинга состояния службы After-Image Management Daemon (AIMD) посредством следующих новых полей виртуальных системных таблиц (VST): Поле _Logging-AISwitchSchedule в таблице VST _Logging отображает временную метку запланированного переключения файла AI в формате datetime-tz. Поле _Logging-AIArchDir в таблице VST _Logging указывает на текущий установленный каталог архива AI из списка директорий, - [Генерация файлов параметров](https://rupug.pro/generate-parameter-file/) - В OpenEdge 12.8 LTS администраторы баз данных могут создавать файлы параметров (.pf) в процессе выполнения для настройки баз данных. Эти файлы могут быть использованы напрямую, без дополнительного редактирования, для перезапуска базы данных с теми же параметрами конфигурации, что и в предыдущей версии. Например, администратор может регулярно использовать файл .pf с параметром -B, установленным на значение - [Многопоточное восстановление базы данных: оптимизация процесса](https://rupug.pro/run-a-multi-threaded-restore/) - Процесс резервного копирования и восстановления является критически важным компонентом стратегии обеспечения непрерывности бизнес-процессов в управлении базами данных. В контексте использования программного обеспечения Progress настоятельно рекомендуется выполнять резервное копирование исходной базы данных перед проведением любых восстановительных операций. Это позволяет создать резервную копию данных, которая может быть использована в случае, если процесс восстановления приведет к некорректной работе - [Ускорение резервного копирования активных баз данных в OpenEdge](https://rupug.pro/back-up-the-running-databases-faster/) - Оптимизация времени, затрачиваемого на резервное копирование, играет ключевую роль в минимизации простоев и обеспечении бесперебойной работы приложений. В последней версии OpenEdge 12.8 LTS были внедрены усовершенствованные функции утилиты PROBKUP, которые значительно повышают скорость резервного копирования в режиме реального времени. Компания Progress рекомендует создавать резервные копии исходных баз данных перед началом любых процедур восстановления. Это гарантирует - [EMEA PUG Challenge 2017 - ожидания и впечатления](https://rupug.pro/emea-pug-challenge-2017-results-of-the-meeting__trashed/) - EMEA PUG Challenge – это невероятные возможности для обмена опытом и простого дружеского общения. - [Релиз OpenEdge 11.6 доступен для коммерческого использования!](https://rupug.pro/openedge-11-6-is-available-for-commercial-use/) - Мы рады сообщить, что корпорация Progress Software объявила о коммерческой доступности ‪#‎OpenEdge‬ 11.6. - [14-ая Ежегодная Конференция пользователей программных продуктов Progress Software](https://rupug.pro/rupugchallenge2015/) - Конференция состоится 1 октября 2015 года, г. Москва, Гостиница «Золотое Кольцо», залы «Ярославль», «Владимир» ул. Смоленская, д.5, ст. м. «Смоленская» - [Вспомним, как всё начиналось - 25 лет Progress в России](https://rupug.pro/how-it-all-started-25-progress-in-russia/) - История появления и развития Progress в России, его признания и использования в современных бизнес-решениях - вспомним как это начиналось 25 лет тому назад. - [Записи вебинаров «Введение в Progress Application Server for OpenEdge»](https://rupug.pro/introduction-to-progress-pacific-application-server-for-openedge-webinar-records/) - рамках вебинара участники смогли получить ответы на вопросы по новому серверу приложений: Стоит ли переходить на него? Какие преимущества он предоставляет? Насколько сложно выполнить переход? Потребуется ли изменение кода? В ходе вебинара были приведены демонстрации работы с Pacific Application Server for OE. - [Вебинар «Введение в Progress Pacific Application Server for OpenEdge»](https://rupug.pro/introduction-to-progress-pacific-application-server-for-openedge/) - За несколько дней мы пройдём путь от основных понятий PAS for OpenEdge, создадим собственный экземпляр PAS и разместим в нём собственные приложения (ABL, REST, SOAP, MOBILE), узнаем как работать с PAS в PDSOE и OEM, и в итоге, научимся разворачивать PAS в промышленной среде. - [Релиз OpenEdge 11.5 доступен для коммерческого использования!](https://rupug.pro/progress-software-openedge-11-5/) - Если вы всё еще используете устаревшие ( - [EMEA‬ ‎PUG Challenge‬ - мы не говорим «Прощай!». Мы говорим «До новых встреч!»](https://rupug.pro/2014pugchallenge2/) - С 19 по 21 ноября в г. Дюссельдорф, Германия, прошла ежегодная конференция пользователей Progress, EMEA PUG Challenge 2014. - [OpenEdge Developer Fast Track Program](https://rupug.pro/openedge-developer-fast-track-program/) - В Progress Software объявили о начале регистрации на беспрецедентный учебный курс для OpenEdge-разработчиков - PROGRESS® OPENEDGE® DEVELOPER FAST TRACK - [13-я Юбилейная Ежегодная Конференция пользователей программных продуктов Progress](https://rupug.pro/rupugchallenge-2014/) - Конференция в этом году будет приурочена к знаменательной дате, 25-лет первого появления Progress в России. 22 октября 2014 г. Москва, ул. Смоленская, д.5, ст. м. «Смоленская» - [Объявлено о коммерческой доступности OpenEdge 11.4](https://rupug.pro/progress-software-openedge-11-4/) - Вы все еще используете Progress v9 или OpenEdge 10? У вас теперь есть еще более веские причины для перехода на OpenEdge 11. - [Модернизация Progress – введение в Javra IDE](https://rupug.pro/javra-ide-introduction/) - Сегодня разные поставщики предлагают разные подходы к модернизации, и каждый из этих подходов имеет претензии на успех, так как на первый взгляд все они выглядят достаточно современно. Тем не менее... - [Progress - двадцать пять лет спустя...](https://rupug.pro/twenty-five-years-later/) - Чего всё началось? И, главное, кто был первопроходцем? На эти вопросы я и решил найти ответы. - [Добро пожаловать на EMEA PUG Challenge 2014!](https://rupug.pro/welcome-to-emea-pug-challenge-2014/) - Приглашаем всех клиентов и партнеров посетить конференцию Европейской группы пользователей Progress EMEA PUG Challenge 2014, которая будет проходить 19-21 ноября 2014 года в Дюссельдорфе. - [Введение в OpenEdge Mobile: Создаём простейшее мобильное приложение](https://rupug.pro/introduction-to-openedge-mobile-3/) - В этой статье мы по шагам создадим простейшее мобильное приложение. Для этого мы разработаем простой мобильный сервис с доступом к базе данных OpenEdge, используя ... - [EMEA PUG Challenge 2014 приглашает спикеров!](https://rupug.pro/emea-pug-challenge-2014-call-for-speakers/) - Мы ждем ваших предложений до 31 мая 2014 г. #EMEAPUGChallenge - [Введение в OpenEdge Mobile: АРХИТЕКТУРА РАЗРАБОТКИ И ИНСТРУМЕНТЫ](https://rupug.pro/introduction-to-openedge-mobile-2/) - Набор средств разработки OpenEdge Mobile состоит из двух основных компонент: Progress Developer Studio for OpenEdge и Progress OpenEdge Mobile App Builder - [Введение в OpenEdge Mobile: RUN-TIME АРХИТЕКТУРА](https://rupug.pro/introduction-to-openedge-mobile/) - OpenEdge Mobile позволяет создавать полноценные мобильные приложения, включая пользовательский интерфейс мобильного клиента... - [Progress Exchange 2014](https://rupug.pro/progress-exchange-2014/) - Отличный повод заявить о себе, а также узнать чем, как и почему Progress привлекает миллионы пользователей со всего мира! - [Исследование потребностей пользователей – магический кристалл для формирования успешного пользовательского опыта](https://rupug.pro/successful-user-experience/) - Исследование потребностей пользователей главным образом фокусируется на понимании ожиданий пользователей, их поведении, потребностях и мотивах использования программного продукта... - [Облака: как объяснить простыми словами](https://rupug.pro/what-is-cloud-computing/) - Облако, что это такое? Облачные вычисления, о чем ты постоянно говоришь, для чего, как, и, главное, зачем? - [Как подключиться к OpenEdge через ODBC из PHP](https://rupug.pro/php-odbc-openedge/) - Простая инструкция по настройке ODBC-подключения из PHP к базе данных Progress OpenEdge - [Progress Software на конференции Dreamforce 2013](https://rupug.pro/progress-software-at-dreamforce-2013/) - В течение трех дней известный художник Дрю Брофи (Drew Brophy) раскрашивал почти пятиметровый стенд Progress Software для конференции Dreamforce 2013 (DF13), которая проходит сейчас в Сан-Франциско, Калифорния, с 18 по 21 ноября 2013 г. На конференции корпорация Progress Software представляет свой новый продукт - Easyl. Задача Easyl - объединить все ваши данные, существенно упростив процессы их сбора, - [Мы там, где считают](https://rupug.pro/we-are-where-considered/) - Непрерывность бизнеса (Business Continuity) – важнейший элемент разработки и реализации инфраструктуры приложения. - [OpenEdge 10.2B в вопросах и ответах](https://rupug.pro/openedge-10-2b-faq/) - Вопрос: Когда был выпущен в промышленную эксплуатацию OpenEdge 10.2B? Ответ: OpenEdge 10.2B стал общедоступным 22 декабря 2009 года. Вопрос: Когда выйдет первый Service Pack для 10.2B? Ответ: Service Pack 01 выпущен 26 апреля 2010 года. Вопрос: Какие основные преимущества у 10.2B? Ответ: OpenEdge 10.2B соответствует самым последним правилам работы с конфиденциальной информацией. Вопрос: Каковы основные - [OpenEdge 10.2B Transparent Data Encryption: краткий анонс](https://rupug.pro/openedge-10-2b-transparent-data-encryption/) - В версии OpenEdge 10.2B введен новый механизм обеспечения безопасности базы данных, который называется Transparent Data Encryption (Прозрачное шифрование данных). Как часть стратегии безопасности, прозрачное шифрование обеспечивает конфиденциальность данных, находящихся в состоянии покоя в OpenEdge базе данных, независимо от того, где располагается база и у кого находится ее копия. Сам процесс шифрования осуществляется параллельно работе пользователя, - [Настройка ODBC для Progress OpenEdge](https://rupug.pro/configuring-odbc-for-progress-openedge/) - Старт сервера базы данных Создайте тестовую базу данных Sports. Для этого создайте новый каталог в любом удобном для вас месте. Допустим, это будет ваш домашний каталог, в котором мы создадим каталог ~/testdb: $ mkdir ~/testdb $ cd ~/testdb Теперь, создайте в этом каталоге базу данных Sports: $ procopy $DLC/sports2000 ./sports Запустите сервер базы данных, указав порт или - [Мы не говорим PaaS, мы говорим aPaaS!](https://rupug.pro/we-dont-talk-paas-we-say-apaas/) - Корпорация Progress Software продолжает бесцеремонно посягать (в хорошем смысле слова) на пространство облачных разработчиков, используя в своем арсенале новые возможности подключения к данным и новейшие возможности приложений в составе собственной облачной платформы разработки, предоставляемой в качестве сервиса (#aPaaS) – Progress Pacific. Mы сказали aPaaS? Именно! Мы все знаем, что PaaS определяется, как возможность аренды оборудования, операционных систем, - [Progress Pacific: свобода для облачных и мобильных приложений](https://rupug.pro/progress-pacific-freedom-for-cloud-and-mobile-applications/) - Принципиально новый подход к разработке, предлагающий выбор источников данных, сред внедрения и средств бизнес-логики Progress Software Corporation (NASDAQ: PRGS) представила Progress® Pacific™ – мощную, простую в использовании платформу для построения и управления "подключаемыми приложениями" в любом Облаке, на любой мобильной и социальной платформе. Подключаемые приложения интегрируются с данными реального времени из множественных источников для более - [Progress OpenEdge 11.3 повышает скорость разработки в пять раз](https://rupug.pro/progress-openedge-11-3-development-speed-increases-fivefold/) - Динамичные гибкие приложения и функции повышения производительности – в новой платформе Progress Pacific. Progress Software Corporation (NASDAQ: PRGS) представляет новейший выпуск Progress®OpenEdge®, который является основной платформой разработки приложений и ключевым компонентом недавно анонсированной Progress Software PaaS-платформы Pacific™. Платформа Progress OpenEdge 11.3 объединяет лучшие возможности систем управления бизнес- процессами (BPM) и управления бизнес-правилами (BRMS), что позволяет - [Progress Arcade - облачный сервис Progress Software](https://rupug.pro/progress-arcade-cloud-service-progress-software/) - Progress® Arcade™ - портал для упрощенного развертывания SaaS-приложений в Облаке. - [Time to Upgrade! OpenEdge 11.3 - улучшение резервного копирования](https://rupug.pro/time-to-upgrade-openedge-11-3-backup/) - В OpenEdge 11.3 в команду PROBKUP добавлена новая опция bibackup, задача которой оптимизация процесса резервного копирования - [Данные - деньги](https://rupug.pro/data-is-money/) - «Время – деньги»? В наше время правильнее было бы говорить - «Данные – деньги». И это особенно верно в отношении программного обеспечения. - [GET POWERED BY PROGRESS](https://rupug.pro/get-powered-by-progress/) - Выбор правильной технологии в долгосрочной перспективе может стать нетривиальной задачей. При принятии решения в пользу той или иной технологии вы должны ... - [PaaS: как сделать выбор?](https://rupug.pro/how-do-you-choose-paas/) - Приведенная инфографика и комментарии к каждой её части помогут сделать вам правильный выбор правильной PaaS. - [OpenEdge Mobile Express - it's a Kind of Magic](https://rupug.pro/openedge-mobile-express-its-a-kind-of-magic/) - OpenEdge Mobile - это как магия, но в то же время ничего не обычного, всё просто и легко! - [В Брюсселе прошла конференция европейских пользователей Progress EMEA PUG Challenge 2013](https://rupug.pro/emeapugchallenge2013/) - 7-8 ноября 2013 года в Брюсселе состоялась конференция EMEA PUG Challenge 2013 – крупнейшая европейская конференция пользователей Progress. Конференция EMEA PUG Challenge ежегодно организуется Ассоциацией групп пользователей Progress в регионе EMEA (Progress Users Group). В этом году участие в конференции приняло 450 человек (разработчики, администраторы БД, партнеры, и конечные пользователи) из 23 стран, – все - [Progress OpenEdge 11.3 (BPM/BRMS) - технический обзор и демонстрация](https://rupug.pro/progress-openedge-11-3-bpmbrms-technical-review-and-demo/) - Летом 2013 года был выпущен релиз Progress OpenEdge 11.3, в основу которого легли BPM и BRMS - технологии, призванные улучшить эффективность бизнеса. Этот релиз принес в платформу Progress OpenEdge мощные средства управления бизнес-процессами и бизнес-правилами. Мы подготовили небольшой документ, в котором рассказывается, какую пользу принесёт бизнесу совместное использование технологий BPM и BRMS. Также было подготовлено - [Progress Sparking Innovation](https://rupug.pro/progress-sparking-innovation/) - Каждое новое дело начинается с идеи - момента вдохновения. Идея может прийти от кого угодно и откуда угодно. Настоящие первопроходцы берут свои идей и превращают их в реальность - мы просто помогаем им сделать это. - [12 Ежегодная конференция пользователей Progress в Москве - более 200 участников!](https://rupug.pro/rupugchallenge-2013-moscow/) - Скачать презентации конференции 23 октября в Москве в гостинице «Золотое Кольцо» состоялась 12-ая ежегодная конференция российских пользователей Progress. О планах развития компании Progress Software рассказал вице-президент по региону EMEA Марк Армстронг (Mark Armstrong). В своем докладе он отметил, что при выработке стратегии компания идентифицировала для себя пять основных факторов, которые будут определять подходы к развитию - [OpenEdge Auditing - забытая история](https://rupug.pro/openedge-auditing-forgotten-history/) - Механизм OpenEdge Auditing - позволяет обеспечить поддержку аудиторского следа при работе пользователей с базой данных Progress OpenEdge. Благодаря этому механизму, вы всегда сможете выяснить кто, когда, и какие изменения вносил в базу. - [Альтернативный буферный пул в СУБД OpenEdge (Progress)](https://rupug.pro/alternative-buffer-pool-in-openedge/) - В Progress OpenEdge 10.2B был введен новый механизм, который называется Альтернативный буферный пул... - [Часто задаваемые вопросы по OpenEdge RDBMS](https://rupug.pro/frequently-asked-questions-openedge-rdbms/) - Мы постарались дать как можно более правильные и универсальные ответы насколько это возможно, но не стоит забывать о том, что существует множество отличающихся друг от друга систем и сред. - [Задачи управления данными: Доступность и Безопасность](https://rupug.pro/top-10-tasks-management-data-availability-and-security/) - Чем больше данных, тем больше их ценность. Но находятся ли эти данные в безопасности и всегда ли они доступны? В первой статье из трёх запланированных мы поможем вам разобраться и решить три из десяти главных задач в управлении данными, которые сегодня стоят практически перед всеми компаниями в мире, — это производительность базы данных, доступность данных - [Доступ к общей памяти базы данных в средах с несколькими процессорами](https://rupug.pro/openedge-and-numa/) - На всех платформах, поддерживаемых Progress и OpenEdge, архитектура с несколькими процессорами неявно поддерживается до тех пор, пока операционная система хоста также обеспечивает гарантированную поддержку многопроцессорности. OpenEdge не содержит специального кода, который оптимизировал бы производительность доступа к памяти для данной архитектуры. В модели CC-NUMA система показывает пользователю только один образ памяти, даже если память физически распределена - [Чек-лист по оптимизации производительности клиентских приложений на платформе Progress OpenEdge](https://rupug.pro/checklist-for-client-performance-fine-tuning/) - Эффективность функционирования информационной системы определяется как характеристиками программного обеспечения, так и параметрами аппаратного обеспечения, на котором оно выполняется. Границы между понятиями «производительность программного обеспечения» и «производительность аппаратного обеспечения» являются достаточно условными. Производительность программного обеспечения зависит от качества исходного кода, методов программирования, архитектуры базы данных и алгоритмов обработки данных. Производительность аппаратного обеспечения определяется конструкцией программного продукта, - [Актуальность обновления до OpenEdge 12.8](https://rupug.pro/updates-to-openedge-version-12-8/) - В связи с истечением срока поддержки версии OpenEdge 11.7 с 1 апреля 2025 года, настоятельно рекомендуется рассмотреть возможность обновления до актуальной версии 12.8. После указанной даты пользователи 11.7 перестанут получать обновления безопасности и исправления ошибок, а также будут иметь доступ к сокращенному уровню технической поддержки. Для получения дополнительной информации по вопросам миграции и жизненного цикла - [OpenEdge Replication: демонстрация настройки механизма](https://rupug.pro/2-openedge-replication-demo/) - #2 OpenEdge Replication: демонстрация настройки механизма от ~bashkat на RUTUBE - [Производительность серверов БД в OE 12](https://rupug.pro/performance-improvement-in-oe-12/) - Тесты производительности, сравнивающие многопоточный сервер баз данных с однопоточным, показывают, что одни и те же операции выполняются в три раза быстрее. - [Стратегии блокировки записей](https://rupug.pro/record-blocking-strategies/) - Блокировка записи представляет собой методологию, направленную на предотвращение одновременного доступа к данным в базе данных с целью исключения возникновения противоречивых результатов. Блокировка записей является неотъемлемым компонентом любой системы, функционирующей в режиме многопользовательского доступа. В данном контексте рассмотрим несколько подходов к управлению многопользовательским доступом к базе данных. Немедленная блокировка Один из методов блокировки заключается в том, - [Как выполнить конвертацию базы данных с OpenEdge 10.2B до OpenEdge 12.8](https://rupug.pro/database-conversion-10-12/) - Для того чтобы конвертировать базу данных, созданную в OpenEdge 10.2B, в OpenEdge 12.8, существует специальный инструмент — скрипт DLC/bin/102dbutils/conv1012. Этот скрипт сначала преобразует базу данных в OpenEdge 11, а затем в OpenEdge 12. В OpenEdge 12.8 нам понадобятся специальные утилиты конвертации из каталогов DLC/bin/102dbutils/ и DLC/bin/117dbutils. Если у вас этих каталогов нет, то скачайте архив - [Обновление лицензий OpenEdge](https://rupug.pro/updating-licenses-openedge/) - Для обновления установленных лицензий останавливать процессы OpenEdge (базы данных, сервера приложений, клиентские сессии) не надо. Чтобы обновить лицензию на Linux, выполните следующие действия: Используйте утилиту SHOWCFG для отображения информации об установленных лицензиях, хранящейся в файле конфигурации $DLC/progress.cfg. Убедитесь в том, что обновляемая лицензия установлена. Обновлять можно только установленные лицензии. Перейдите в каталог, в котором установлен - [Высокая доступность и надёжность для приложений на платформе OpenEdge](https://rupug.pro/high-availability-and-reliability-of-openedge/) - Наличие высокодоступного и отказоустойчивого приложения, использующего OpenEdge, требует наличия нескольких компонентов в архитектуре, возможности масштабирования в соответствии с изменяющимися требованиями и нагрузками, а также наличия реплицированных наборов компонентов при сбое частей приложения. Этот тип репликации компонентов и масштабируемости лучше всего работает в облачной или виртуальной среде, где эти инструменты широко распространены и хорошо поддерживаются. Однако - [Почему я не вижу всех преимуществ разделения таблиц на секции?](https://rupug.pro/why-arent-i-seeing-all-the-benefits-of-table-partitioning/) - Эффективная стратегия секционирования таблиц требует глубокого понимания взаимосвязей и шаблонов доступа к данным, а также разработки стратегии секционирования, которая позволит оптимально распределить данные для обеспечения наилучшего обслуживания и производительности. В настоящее время ваша компания демонстрирует устойчивый рост: ежедневно поступают новые заказы и заключаются сделки. При этом объём данных увеличивается с такой скоростью, что возникает желание, - [Балансировка нагрузки PAS for OpenEdge на основе Tomcat Load Balancing](https://rupug.pro/implementing-tomcat-load-balancing-for-pas4oe/) - Для нового сервера приложений балансировка нагрузки реализуется с помощью опций HTTP с использованием одной из сторонних технологий, таких как Apache Tomcat - [Руководство по стандартам программирования на PROGRESS ABL (4GL)](https://rupug.pro/guide-to-programming-standards-in-progress-abl-4gl/) - Это руководство предназначено для стандартизации программирования языке ABL, и дать рекомендации для групп разработчиков и менеджеров в процессе проверки кода. - [Производительность ABL (4GL): с чего начать?](https://rupug.pro/performance-abl-4gl-where-to-start/) - Настройка производительности – это процесс улучшения и ускорения работы системы за счёт более эффективного использования доступных ресурсов. - [Причины перехода на OpenEdge 12](https://rupug.pro/reasons-for-updating-to-openedge-12/) - Почему необходимо обновиться до OpenEdge 12? Какое условие является обязательным для перехода? Как обосновывать необходимость обновления? - [Обновление БД с OpenEdge 10 до OpenEdge 12.x](https://rupug.pro/upgrade-db-from-openedge-10-to-openedge-12-x/) - Как обновить базу данных OpenEdge 10 до версии OpenEdge 12? Нет ничего проще. - [Progress JSDO и Kendo UI](https://rupug.pro/progress-jsdo-and-kendo-ui/) - Kendo UI – это JavaScript фреймворк, который используется для создания Web и Mobile приложений с применением HTML5 и JavaScript. - [Фоновая установка OpenEdge](https://rupug.pro/silent-installation-openedge/) - Интерактивная установка, которую мы использовали для базовой инсталляции в прошлой статье, запрашивает от вас данные и сохраняет ответы с помощью серии диалоговых окон. После завершения ввода данных инсталлятор немедленно использует их для установки необходимых продуктов OpenEdge. Фоновая установка или тихая установка (silent install) напротив, это двухэтапный процесс: Данные, введённые в процессе интерактивной установки, записываются в - [Оператор ABL VAR в OE 12.3](https://rupug.pro/оператор-abl-var-в-oe-12-3/) - PSC в ноябре 2020 года выпустила версию OpenEdge 12.3, включив в нее ряд расширений языка ABL, в частности обновлён оператор ABL VAR. - [Шифрование данных в OpenEdge](https://rupug.pro/transparent-data-encryption-in-openedge/) - В этой статье приводятся примеры работы с Transparent Data Encryption в OpenEdge. Процесс работы с зашифрованной базой данных рассмотрен от A до Я. - [Функция ABL GUID и стандарты](https://rupug.pro/function-abl-guid-and-standards/) - В OpenEdge ABL имеются встроенные функции GUID и GENERATE-UUID, позволяющие генерировать GUID в программах на ABL, но соответствуют ли они стандартам? - [Как проверить сертификат RuPUG](https://rupug.pro/how-to-check-the-rupug-certificate/) - Подлинность сертификата, который был получен по результатам прохождения самостоятельного тренинга на сайте RuPUG Education Center, можно подтвердить путём сканирования QR-кода на бумажном документе. Результатом сканирования будет ссылка на электронный сертификат на сайте rupug.pro. Перейдите по ссылке и выполните сверку данных электронного и бумажного документов. - [Что нового в OpenEdge 12](https://rupug.pro/whats-new-in-openedge-12/) - Мощная, доступная и исключительная, ведущая платформа для создания и доставки критически важных бизнес-приложений достигает новых высот в производительности, масштабировании, непрерывных операциях, гибкой разработке и повышенной безопасности. Ключевые особенности Новые функции и улучшения OpenEdge 12 помогают организациям удовлетворять растущие требования к функциональности, производительности, доступности и безопасности приложений. Производительность и масштабируемость​Значительное улучшение пропускной способности баз данных, до - [Настройка и управление OpenEdge-адаптерами в OpenEdge Management](https://rupug.pro/configuring-wsa-in-openedge-management/) - OpenEdge Management поддерживает несколько адаптеров, таких как AppServer Internet Adapter, Web Services Adapter и SonicMQ Adapter. - [Настройка и управление серверными ресурсами в OpenEdge Management](https://rupug.pro/configuring-and-managing-openedge-server-resources/) - Помимо баз данных OpenEdge Management также поддерживает работу с такими серверными OpenEdge-продуктами, как AppServer, WebSpeed Transaction Server и NameServer... - [Управление ресурсами OpenEdge Database в OpenEdge Management](https://rupug.pro/configuring-and-managing-openedge-database-resources/) - В терминах OpenEdge Management существует два типа ресурсов баз данных, это Managed Databases и Scripted Databases. В этой статье мы рассмотрим способ настройки ресурсов типа Managed Databases. - [Настройка OpenEdge Management для управления удаленными машинами](https://rupug.pro/openedge-management-adding-remote-containers/) - Возможность дистанционного управления - одна из важных функций, которую предоставляет OE Management. - [Управление пользователями OpenEdge Management](https://rupug.pro/openedge-users-management/) - OpenEdge Management предназначен для настройки, мониторинга и управления OpenEdge-ресурсами. Сегодня изучим, как управлять пользователями OpenEdge Management. - [Консоль OpenEdge Management - краткий обзор](https://rupug.pro/openedge-management-console-overview/) - Консоль OpenEdge Management это пользовательский веб-интерфейс, который работает в качестве плагина AdminServer-а - [Первоначальная настройка OpenEdge Management](https://rupug.pro/oemgt-first-config/) - При первом подключении к OpenEdge Management необходимо выполнить простую первичную настройку. - [Архитектура OpenEdge Management](https://rupug.pro/openedge-management-architecture/) - Система мониторинга OpenEdge Management и OpenEdge Explorer - мониторинг и управление OpenEdge-ресурсами. Часть 3. - [OpenEdge Management и OpenEdge Explorer - мониторинг и управление OpenEdge-ресурсами. Часть 2.](https://rupug.pro/openedge-management-and-openedge-explorer-part-2/) - Система оповещений, выполнение заданий по расписанию и мониторинг лог-файлов с помощью OpenEdge Management - [OpenEdge Management и OpenEdge Explorer - мониторинг и управление OpenEdge-ресурсами и не только](https://rupug.pro/openedge-management-and-openedge-explorer-part-1/) - Система мониторинга OpenEdge Management и OpenEdge Explorer - мониторинг и управление OpenEdge-ресурсами. Часть 1 - [СЕКРЕТЫ OPENEDGE: УПРАВЛЕНИЕ БАЗАМИ ДАННЫХ OPENEDGE ПРИ ПОМОЩИ OPENEDGE MANAGEMENT](https://rupug.pro/secrets-of-openedge-management-database/) - Книга начинается с изучения основных ресурсов сервера – дисковых устройств, памяти и процессора. Книга объясняет, что же это такое — база данных OpenEdge и каким образом эта база данных использует ресурсы. - [OpenEdge Web Server и REST-приложения в OpenEdge Management](https://rupug.pro/configuring-oe-web-server-in-openedge-management/) - С помощью OpenEdge Management вы можете управлять OE Web Server ресурсами, а уже через них, размещать REST-приложения и управлять ими. - [Знакомимся с планами мониторинга в OpenEdge Management](https://rupug.pro/oemgmt-overview-of-monitoring-plans/) - Вы, конечно, хотели бы немедленно получать соответствующие уведомления при возникновении каких-либо проблем с любым из таких ресурсов? - [Методы извлечения данных](https://rupug.pro/data-retrieval-methods/) - Эффективный запрос может значительно ускорить поиск данных, и наоборот, плохо написанный значительно замедлит этот процесс. - [Объединение данных в запросах](https://rupug.pro/joining-data-in-queries/) - Объединение данных в запросах (joins) формирует набор записей из нескольких связанных таблиц, которые имеют общие поля. - [Progress OpenEdge Developers Kit: Classroom Edition](https://rupug.pro/progress-openedge-developers-kit-classroom-edition/) - Инструментарий для разработки приложений, предназначенный для начинающих разработчиков эффективных OpenEdge-приложения - [Как отправить запрос на улучшение в Progress?](https://rupug.pro/how-to-send-request-for-improvement/) - Хотите, чтобы появилась какая-то новая возможность или была улучшена существующая? Добро пожаловать на новый портал Progress Enhancement Request System (ERS) - [Развивайте своё приложение с OpenEdge 12.1](https://rupug.pro/develop-your-app-with-openedge-12-1/) - От высокопроизводительной базы данных до высокой доступности – что нового в OpenEdge 12.1 и как это поможет улучшить ваше приложение сегодня? - [Итоги 18-ой ежегодной Российская конференция пользователей Progress](https://rupug.pro/итоги-18-ой-ежегодной-российская-конфер/) - В работе Конференции приняли участие свыше 120-ти специалистов в области информационных технологий из России, Казахстана, Латвии, Эстонии и Белоруссии. - [Обнаружение и исправление проблем до того, как они повлияют на бизнес-процессы](https://rupug.pro/protop-overview/) - На работе, дома или в дороге – доступ к состоянию вашей среды OpenEdge никогда не будет дольше, чем на расстоянии одного клика. - [Сокращение времени простоя с помощью Progress Application Server for OpenEdge HealthScanner](https://rupug.pro/reduce-downtime-with-progress-application-server-for-openedge-healthscanner/) - Как и индикатор Check Engine в автомобиле, HealthScanner отслеживает различные показатели и оценивает “состояние здоровья” сервера приложений. - [Итоги EMEA PUG Challenge 2019](https://rupug.pro/emea-pug-challenge-2019-results/) - 29-31 октября 2019 в столице Каталонии городе Барселоне состоялась 10-я юбилейная ежегодная конференция европейских пользователей EMEA PUG Challenge 2019 - [Java в OpenEdge 12.1 не будет?](https://rupug.pro/no-java-in-openedge121/) - В первую очередь причиной является изменение условий лицензирования поставщиком Java... - [30 лет Progress в России](https://rupug.pro/30-years-progress-in-russia/) - Эту круглую дату мы собираемся отметить в рамках 18-й ежегодной Российской Конференции пользователей программных продуктов Progress в Москве. - [Сокращение времени простоя приложений для обновления с помощью PAS for OpenEdge](https://rupug.pro/reduce-application-maintenance-downtime-with-pas-for-openedge/) - ReduПоследняя версия PAS for OpenEdge (новый сервер приложений OpenEdge) имеет ряд новых функций, которые позволяют обновить приложение без простоев в обычные рабочие часы не затрагивая пользователей. ce Application Maintenance Downtime with PAS for OpenEdge - [EMEAPUG Challenge, Barcelona 2019](https://rupug.pro/emeapug-challenge-barcelona-2019/) - See you in Bacelona, or as the locals say: «Nos vemos en Barcelona!» - [EMEAPUG Challenge, Барселона 2019](https://rupug.pro/emeapug-challenge-barcelona-2019-rus/) - На сегодня около 200 человек зарегистрировалось для участия в конференции в Барселоне этой осенью. Присоединяйтесь к ним и нам на самой большой, невероятной и лучшей конференции Progress OpenEdge в этом году. - [Progress OpenEdge 12 – обеспечение трёхкратного повышения производительности](https://rupug.pro/progress-openedge-12/) - Непрерывная доступность, развёртывание Docker-контейнеров, новые усовершенствования on demand, улучшения безопасности и масштабируемости, и многое другое... - [OpenEdge Advanced Enterprise RDBMS - что это?](https://rupug.pro/openedge-rdbms-advanced-enterprise/) - Progress OpenEdge Advanced Enterprise – комплексная многопроцессорная среда, поддерживает тысячи одновременно работающих пользователей и терабайты данных. - [OpenEdge 11.7 - что нового?](https://rupug.pro/webinar-what-new-in-openedge-11-7/) - Progress OpenEdge 11.7 - самая мощная, многофункциональная платформа для создания бизнес-приложений. - [ABL Dojo – тестируй и изучай ABL с помощью веб-браузера](https://rupug.pro/abl-dojo-introduction/) - ABL Dojo помогает начинающим разработчикам на языке ABL создавать и анализировать фрагменты кода быстрее и проще, чем когда-либо. - [Основы баз данных с OpenEdge](https://rupug.pro/database-basics-with-openedge/) - Задача – сформировать у читателя понимание основных принципов реляционных высокопроизводительных баз данных на примере СУБД OpenEdge. - [Области хранения второго типа](https://rupug.pro/storage-area-type-2/) - Наиболее важное значение имеет разделение данных, индексов и LOB и сам факт использования областей второго типа. Если вы всё сделаете правильно, то вы получите 90% улучшение реализовав только эти две вещи. - [Progress EMEA PUG Challenge 2018 на изумрудном острове](https://rupug.pro/progress-emea-pug-challenge-2018/) - 10 – 12 октября 2018 года в столице Ирландии городе Дублин состоялась очередная конференция EMEA PUG Challenge, которая ежегодно организуется Ассоциацией групп пользователей в регионе EMEA (Progress Users Group). - [Редакция Advanced Enterprise](https://rupug.pro/advanced-enterprise-edition/) - Быстрые изменения в современной бизнес-среде означают, что ваши инструменты должны быть актуальными и достаточно мощными для управления высоконагруженными базами данных. Progress предоставляет инновационную облачную среду SaaS (Software as a Service) и решение для разработки приложений в одном пакете – не обременяя бюджет и без ущерба для безопасности. Вы получаете масштабируемую, производительную, надёжную и доступную в - [Что такое OpenEdge Reference Architecture (OERA)?](https://rupug.pro/what-is-oera/) - Из этой статьи вы узнаете о Progress OpenEdge Reference Architecture (OERA) и преимуществах её использования как основы для разработки приложений. - [Обзор OpenEdge-процессов](https://rupug.pro/overview-openedge-processes/) - Архитектура приложения определяет структуру приложения и то, как различные части приложения взаимодействуют друг с другом. Здесь рассказывается об основных процессах OpenEdge. - [Progress OpenEdge: промышленные средства репликации данных в Oracle и MS-SQL](https://rupug.pro/pro2workshop2015/) - Приглашаем вас посетить технологический семинар «Progress OpenEdge промышленные средства репликации данных в Oracle и MS-SQL в режиме реального времени», который состоится 30 сентября 2015 г. - [Поздравляем с Международным женским днем](https://rupug.pro/8-march-2015/) - Девочки наши, красавицы, в этот день мимозы и тюльпанов поздравляем вас с 8 марта и говорим спасибо, за то, что вы есть! - [Подключение к базе данных OpenEdge с помощью JDBC из Java-приложения (пример)](https://rupug.pro/java-jdbc-openedge/) - К базам данных OpenEdge можно подключаться различными способами, и не всегда клиентское приложение должно быть написано на ABL. - [Что такое OpenEdge сегодня?](https://rupug.pro/brief-overview-of-openedge-platform/) - OpenEdge – это платформа разработки и размещения бизнес-приложений, которые могут быть развернуты как на собственном оборудовании, так и в Облаке. - [Вебинар "Обзор OpenEdge Table Partitioning"](https://rupug.pro/webinar-openedge-table-partitioning/) - На семинаре вы узнаете о возможностях OpenEdge Table Partitioning, а во время демонстраций увидите своими глазами, как работает этот механизм. - [Присоединяйтесь к Progress Community!](https://rupug.pro/join-the-progress-community/) - В настоящее время Progress Community – это глобальная организация, имеющая в своём распоряжении значительные ресурсы, нацеленные на отслеживание ваших отзывов, чтобы иметь возможность предлагать вам наилучшие решения, способствуя улучшению вашего пользовательского опыта. - [Хотите учиться самостоятельно?](https://rupug.pro/progress-education-community/) - Progress Software предоставляет возможность онлайн обучения в специализированном центре Progress Education Community (PEC), который предлагает полный набор... - [Добро пожаловать на форум группы](https://rupug.pro/welcome-to-pug-russia-forum/) - Перед вами открываются новые возможности для быстрого решения ваших задач, получения ответов на ваши вопросы и неформального общения с Progress-пользователями со всего мира, в том числе с сотрудниками Progress Software. - [Старт и останов БД в многопользовательском режиме](https://rupug.pro/start-shutdown-openedge-database/) - Практическое занятие представляет собой одну из частей лабораторных работ, выполняемых на курсе «Ключевые аспекты администрирования СУБД OpenEdge v10-11» - [О брокере базы замолвите слово](https://rupug.pro/openedge-database-broker/) - Брокер базы данных #OpenEdge - это progress-процесс, задача которого управлять доступом к базе данных, запущенной в многопользовательском режиме. - [Поздравляем с 8 Марта!](https://rupug.pro/8-march-2014/) - Поздравляем вас, обожаем вас, желаем вам светлого-светлого, прекрасного-чудесного, нужного-хорошего, в общем, самого лучшего в мире всего и очень много! - [База знаний Progress OpenEdge](https://rupug.pro/knowledgebase-progress-openedge/) - Все сообщения, которые OpenEdge выводит на экран или в лог базы данных, имеют свою нумерацию. С помощью этих номеров можно быстро найти решение возможной проблемы используя Базу знаний Progress (Progress Knowledge Base, известную как ProKB). Именно к ProKB необходимо обращаться в первую очередь для поиска решения любой проблемы, сообщение о которой содержит номер, заключенный в - [Что такое OpenEdge RDBMS?](https://rupug.pro/Что-такое-openedge-rdbms/) - Высокопроизводительная реляционная база данных, способная масштабироваться от однопользовательского ноутбука до промышленных многопроцессорных сред. - [Создание двух TARGET баз средствами ОС](https://rupug.pro/creating-a-target-database-using-the-operating-system-part2/) - В первой части статьи мы изучили способ создания одной TARGET-базы средствами ОС. Но как быть, если нам сразу нужно создать две TARGET-базы? Или как создать вторую TARGET-базу позже, например, когда через несколько месяцев после успешного включения репликации мы получили второй резервный сервер? - [Создание TARGET-базы средствами операционной системы](https://rupug.pro/creating-a-target-database-using-the-operating-system/) - В стандартном варианте для создания TARGET-баз данных используется резервная копия SOURCE-базы, созданная с помощью утилиты PROBKUP. И это правильно, надежно и удобно, но только до поры до времени, пока размер базы данных небольшой, скажем до 100Гб. Но что если размер базы данных несколько сотен гигабайт? - [Безопасность OpenEdge-приложений](https://rupug.pro/openedge-security/) - Принятие решения о проактивной защите данных должно сопровождаться пониманием того, что никакая система обеспечения безопасности не может быть надежной на 100% - [Добавление новых OpenEdge-продуктов к текущей OpenEdge-инсталляции](https://rupug.pro/how-to-add-new-openedge-product/) - Процесс добавления ничем не отличается от первичной инсталляции, за исключением того, что в качестве установочного каталога нужно указать каталог, в котором установлена текущая конфигурация OpenEdge. - [Русификация баз данных OpenEdge](https://rupug.pro/codepage-convert-rus/) - Пошаговая инструкция по смене кодировки базы данных OpenEdge - [Почему растет размер BI файла?](https://rupug.pro/why-bi-file-grow/) - Когда создается новый .bi файл, то в нём автоматически размещается четыре кластера. - [Как определить оптимальный размер BI-кластера](https://rupug.pro/calc-bi-cluster-size/) - Размер BI кластера влияет на частоту возникновения контрольных точек (checkpoints) в базе данных. В основном, большой размер кластера означает... - [Использование частных буферов (Private Buffers) в Progress](https://rupug.pro/private-buffers-in-openedge-progress/) - Чтобы понять когда и как необходимо использовать частные буфера в Progress, давайте сначала поймем, каким образом Progress работает с буферами. - [Тюнинг механизма Before-Imaging](https://rupug.pro/tuning-before-imaging-in-openedge/) - Before-Imaging это механизм, который всегда активируется для того чтобы PROGRESS мог восстановить изменения незавершенных транзакций, в случае если произошел системный сбой. ## Страницы - [Home](https://rupug.pro/) - Центр обучения RUPUG специализируется на обучении программированию на языке ABL (4GL) и работе с базой данных OpenEdge. Все материалы предоставляются бесплатно. - [О нас](https://rupug.pro/about-us/) - Кто мы и почему мы это делаем... - [User Account](https://rupug.pro/user-account/) - [Reset Password](https://rupug.pro/reset-password/) - [Forgot Password](https://rupug.pro/forgot-password/) - [User Register](https://rupug.pro/user-register/) - [User Login](https://rupug.pro/user-login/) - Вход через логин и пароль Username or email Password Забыли пароль? Запомни меня Нет аккаунта? Регистрируйся прямо сейчас - [Instructor](https://rupug.pro/instructor/) - [Instructors](https://rupug.pro/instructors/) - [Профиль пользователя](https://rupug.pro/profile/) - [Home - English](https://rupug.pro/home-english/) - [Стать инструктором](https://rupug.pro/become-a-teacher/) - Как стать инструктором Создавайте будущее делясь знаниями! Пожалуйста войти чтобы отправить запрос! У вас есть интересный материал по OpenEdge и вы готовы помочь в наполнении сайта полезным контентом? Вы знаете английский язык и готовы переводить с английского на русский технические материалы? Или, возможно, Вы готовы принять на себя роль редактора? Добро пожаловать в нашу команду! - [Тренинги](https://rupug.pro/courses/) - [Terms & Conditions](https://rupug.pro/terms-conditions/) - [Подписка](https://rupug.pro/subscribe/) - [Страница подтверждения регистрации](https://rupug.pro/registration-confirmation-page/) - [user_verification_check] - [Account](https://rupug.pro/account/) - Вход через логин и пароль Если Вы – человек, тогда лучше оставить это поле пустым: Забыли пароль? Запомнить меня Нет аккаунта? Регистрируйся прямо сейчас - [Выставление счёта за подписку](https://rupug.pro/account-rate-levels-of-subscription/выставление-счёта-за-подписку/) - [pmpro_checkout] - [Контакт](https://rupug.pro/contact/) - Отправить сообщение Ваш адрес электронной почты не будет опубликован. Отмечены обязательные поля. Δ - [Уровни подписки](https://rupug.pro/account-rate-levels-of-subscription/subscription-levels/) - [pmpro_levels] - [Аккаунт тарифа](https://rupug.pro/account-rate-levels-of-subscription/) - [Отмена тарифа](https://rupug.pro/account-rate-levels-of-subscription/отмена-тарифа/) - [pmpro_cancel] - [Подтверждение тарифа](https://rupug.pro/account-rate-levels-of-subscription/подтверждение-тарифа/) - [pmpro_confirmation] - [Счет тарифа](https://rupug.pro/account-rate-levels-of-subscription/счет-тарифа/) - [pmpro_invoice] - [Оплата тарифа](https://rupug.pro/account-rate-levels-of-subscription/оплата-тарифа/) - [pmpro_billing] - [MyCheckoutPage](https://rupug.pro/mycheckoutpage/) - [Membership Cancel](https://rupug.pro/membership-account/membership-cancel/) - [pmpro_cancel] - [Membership Billing](https://rupug.pro/membership-account/membership-billing/) - [pmpro_billing] - [Membership Checkout](https://rupug.pro/membership-account/membership-checkout/) - [pmpro_checkout] - [Membership Confirmation](https://rupug.pro/membership-account/membership-confirmation/) - [pmpro_confirmation] - [Membership Invoice](https://rupug.pro/membership-account/membership-invoice/) - [pmpro_invoice] - [Membership Levels](https://rupug.pro/membership-account/membership-levels/) - [pmpro_levels] - [Membership Account](https://rupug.pro/membership-account/) - [Gallery](https://rupug.pro/gallery/) - [Portfolio Grid](https://rupug.pro/portfolio-grid/) - [thim-portfolio filter_hiden=”” column=”three” gutter=”yes” item_size=”same” show_readmore=””] - [Portfolio Multigrid](https://rupug.pro/portfolio-multigrid/) - [thim-portfolio filter_hiden=”” gutter=”yes” item_size=”multigrid” style-item=”style05″ show_readmore=””] - [Portfolio Masonry](https://rupug.pro/portfolio-masonry/) - [thim-portfolio filter_hiden=”” column=”three” gutter=”yes” item_size=”masonry” style-item=”style05″ show_readmore=””] - [My Account](https://rupug.pro/my-account/) - [Shop](https://rupug.pro/shop/) - [Activity](https://rupug.pro/activity/) - [Members](https://rupug.pro/members/) ## Events - [EMEA PUG Challenge 2021](https://rupug.pro/events/emea-pug-challenge-2021/) - МЕРОПРИЯТИЕ ОТМЕНЕНО В СВЯЗИ С РАСПРОСТРАНЕНИЕМ КОРОНАВИРУСНОЙ ИНФЕКЦИИ COVID-19 Вена - столица Австрии и место проведения EMEA PUG CHALLENGE 2021 - конференции для всех клиентов Progress, партнёров и конечных пользователей партнёрских бизнес-приложений. Вена - это также культурная столица Европы, город с уникальным шармом, живописью и вкусом. Она может похвастаться великолепной инфраструктурой, благополучной и безопасной, и - [Progress OpenEdge Technology Summit](https://rupug.pro/events/progress-openedge-technology-summit/) - Саммит Progress OpenEdge Technology (POET) - это онлайн-конференция для всех, кто интересуется Progress OpenEdge. Конференция представит около 40 сессий под руководством экспертов сообщества и нацелена на любого пользователя технологии OpenEdge: разработчики программного обеспечения, архитекторы, администраторы баз данных, инженеры DevOps, ... Конференция будет транслироваться в прямом эфире в течение двух дней из Кельна, Германия. Регистрация на конференцию - [Представляем командный центр OpenEdge (вебинар)](https://rupug.pro/events/introducing-openedge-command-center/) - Центр управления OpenEdge - это консоль управления, предназначенная для контроля PAS for OpenEdge, баз данных OpenEdge, серверов данных и т. д. - [Progress Talks: переход на OpenEdge 12](https://rupug.pro/events/progress-talks-migrating-to-openedge-12/) - Презентация с живыми вопросами и ответами 28 апреля 2021 г., 18:00 по московскому времени. Зарегистрируйтесь и не забудьте задать свои вопросы во время сессии. - [Ключевые аспекты администрирования СУБД Progress OpenEdge](https://rupug.pro/events/key-aspects-of-progress-openedge-dba/) - RUPUG Education Center| Компания Progress Technologies объявляет о проведении и приглашает Вас принять участие в учебном курсе: «Ключевые аспекты администрирования СУБД Progress OpenEdge» Время проведения: 8 - 19 февраля 2021 г. Место проведения: ОНЛАЙН Продолжительность: вариативно 10 дней, 3-4 часа в день Стоимость: 1295 долл США (курс ЦБ РФ на день оплаты) + НДС В свете продолжающегося развития пандемии - [The Successful Six: OpenEdge Management + Table Partitioning](https://rupug.pro/events/the-successful-six-openedge-management-table-partitioning/) - Заключительная сессия серии "The Successful Six" посвящена тому, как сделать так, чтобы все в вашем бизнесе шло гладко. Убедитесь, что ваша база данных работает максимально эффективно благодаря OpenEdge Management и OpenEdge Table Partitioning, двух из шести ключевых функций OpenEdge RDBMS Advanced Enterprise Edition (AEE). На этой сессии будут обсуждаться: Как проактивно контролировать и поддерживать бесперебойную - [The Successful Six: защита данных с OpenEdge Replication + TDE](https://rupug.pro/events/the-successful-six-защита-данных-с-openedge-replication-tde/) - Команда #OpenEdge подготовила несколько познавательных сессий, которые посвящены "Успешной шестерке" (The Successful Six) - включенных в OpenEdge RDBMS Advanced Enterprise Edition (AEE) продукты. Защита ваших данных является главным приоритетом, и первая сессия в серии погружается в вопрос "зачем?". Вы увидите, как можно защитить свои данные без негативного влияния на производительность базы данных с помощью OpenEdge - [The Successful Six: Multi-tenancy + Change Data Capture](https://rupug.pro/events/the-successful-six-multi-tenancy-change-data-capture/) - Производительность базы данных имеет решающее значение для успешного бизнеса, поэтому вторая сессия в серии “The Successful Six” посвящена тому, как максимально использовать возможности базы данных. Вы узнаете, как повысить производительность базы данных с OpenEdge Multi-tenancy и OpenEdge Change Data Capture (CDC), двух из шести ключевых функций OpenEdge RDBMS Advanced Enterprise Edition (AEE). На этой сессии - [Вебинар: Progress Talks OpenEdge 12.1 Live](https://rupug.pro/events/progress-talks-openedge-12-1-live/) - OpenEdge 12.1 опирается на фундамент, заложенный в 12.0 и позволяет предприятиям процветать и конкурировать в современном бизнес-ландшафте. Присоединяйтесь к вебинару 18 сентября в 18:00 по московскому времени и узнайте о новых возможностях из первых рук. В вебинаре примут участие OpenEdge эксперты, сыгравшие ключевую роль в этом релизе. Они поделятся информацией об улучшениях в OpenEdge 12.1 - [Конкурс RuPUG DBA Challenge 2019](https://rupug.pro/events/rupug-dba-challenge-2019/) - После многочисленных служебных записок ты получил разрешение на столь необходимое технологическое окно для производственной базы данных, которая отчаянно нуждается в техническом обслуживании. На протяжении многих лет обновлялись версии Progress OpenEdge, а также устанавливались сервис-паки и хот-фиксы к ним. При этом обновления версий делались только путём конвертации базы данных. Некоторые параметры сохранились со времён Progress v6. - [EMEA PUG Challenge 2019](https://rupug.pro/events/emea-pug-challenge-2019/) - Добро пожаловать на EMEA PUG CHALLENGE 2019! Компания Progress Technolgies, официальный дистрибьютор Progress Software Corp. на территории стран СНГ и Латвии, имеет честь сообщить своим клиентам и партнёрам о начале регистрации на конференцию Европейской группы пользователей Progress EMEA PUG Challenge 2019, которая состоится 29-31 октября 2019 года в Барселоне (Barcelona), Испания. Посещение конференции EMEA PUG Challenge — это - [Конференция пользователей программных продуктов Progress 2019](https://rupug.pro/events/rupug-challenge-2019/) - Дорогие друзья! Компания Progress Technologies, официальный дистрибьютор компаний Progress Software Corp. и Aurea Software, Inc. на территории стран СНГ и Латвии, имеет честь пригласить Вас принять участие в 18-й ежегодной Российской Конференции пользователей программных продуктов Progress и Sonic в Москве, которая состоится 07 ноября 2019 года в гостинице «Золотое Кольцо»: г. Москва, ул. Смоленская, д. 5, ст. м. - [Конференция финской группы пользователей Progress](https://rupug.pro/events/конференции-финской-группы-пользова/) - Приглашает Вас принять участие в Конференции финской группы пользователей Progress, которая состоится в Санкт-Петербурге. Не пропустите отличную возможность одновременно посетить конференцию, отдохнуть в нашей прекрасной "Северной столице" и провести время с пользой, узнав не мало полезного от известных людей мира Progress, а так же, пообщавшись с нашими соседями, вы узнаете чем живет мир Progress в ## Our Team - [Андрей Шитый](https://rupug.pro/our_team/andrew-shytiy/) - Более чем четырнадцатилетний опыт в администрировании и разработке программного обеспечения на базе Progress OpenEdge. В свободное время занимается спортом, увлекается чтением русской классической литературы, исторических трудов и путешествиями. В настоящее время занимает должность руководителя центра компетенций Progress 4GL в ООО "ИнвестЛаб". - [Валерий Башкатов](https://rupug.pro/our_team/valery-bashkatov/) - Инженер технической поддержки и консультант по технологиям Progress Software в компании Progress Technologies. Автор обучающих статей и учебных пособий по платформе OpenEdge. Опыт работы с платформой OpenEdge c 2003 года. - [White Start Software](https://rupug.pro/our_team/white-start-software/) - [Александр Леоненко](https://rupug.pro/our_team/alexander-leonenko/) - Выпускник Ленинградского Кораблестроительного института (Инженер-исследователь). Один из первых, кто начинал работать с Progress в России. Опыт работы с OpenEdge (Progress) более 20 лет (с 1989 г.), как в России, так и в США и Европе. - [Progress Technologies](https://rupug.pro/our_team/progress-technologies/) - Компания Progress Technologies концентрируется не на приложениях, а на задачах продвижения технологий, что наилучшим образом отвечает стратегическим целям корпорации Progress Software, в основе которых лежит предложение рынку самых совершенных продуктов для построения информационных систем, удовлетворяющих потребности бизнеса не только сегодняшнего дня, но и уже недалекого и неизбежного будущего с его новыми требованиями обработки колоссальных объемов - [Progress Software](https://rupug.pro/our_team/progress-software/) - Progress Software Corporation (NASDAQ: PRGS) - глобальный поставщик программного обеспечения, которое упрощает разработку, развертывание и управление бизнес-приложениями на собственном оборудовании или в Облаке, на любой платформе или устройстве, с возможностью подключения к любому источнику данных, с минимальной сложностью и низкой совокупной стоимостью владения. https://www.progress.com - [Russian Progress User Group](https://rupug.pro/our_team/russian-progress-user-group/) - Российская группа пользователей продуктов корпорации Progress Software. - [EMEAPUG Challenge](https://rupug.pro/our_team/emea-pug/) - EMEAPUG Challenge - это конференция для всех, кто использует продукты прогресса для разработки или запуска бизнес-систем, будь то разработчики, архитекторы программного обеспечения, администраторы баз данных, специалисты по инфраструктуре, бизнес-аналитики или продавцы. https://pugchallenge.eu ## Курсы - [Базовые основы ABL](https://rupug.pro/courses/programming/abl-basic/) - Руководство посвящено основам ABL применимым как к процедурному, так и к объектно-ориентированному программированию. Предполагается, что у вас уже есть знания и опыт программирования на другом языке высокого уровня. Руководство знакомит с основами ABL и содержит ссылки на другую документацию, где можно найти дополнительную информацию. - [PAS for OpenEdge: настройка сервера приложений](https://rupug.pro/courses/rdbms/tuning-pas-for-openedge/) - Документ содержит рекомендации по настройке PAS for OpenEdge. Включает архитектурные сведения и элементы управления конфигурацией. - [Расширенное администрирование СУБД OpenEdge](https://rupug.pro/courses/rdbms/avdoedba/) - В рамках тренинга «Основы администрирования СУБД OpenEdge» были рассмотрены базовые процедуры администрирования баз данных. Данное пособие посвящено более детальному описанию дополнительных задач администрирования, направленных на повышение эффективности и надежности функционирования СУБД OpenEdge. - [Краткий обзор OpenEdge](https://rupug.pro/courses/rdbms/101-1-introduction-to-openedge-rdbms-administration/) - Этот краткий обзор компонент базы данных Progress® OpenEdge® RDBMS, а также двух серверов приложений – Progress Application Server for OpenEdge и OpenEdge Application Server. - [Альтернативный буферный пул](https://rupug.pro/courses/rdbms/alternative-buffer-pool/) - Альтернативный буферный пул — это инструмент, который позволяет оптимизировать работу с данными в базе данных. Он используется независимо от первичного буферного пула и может улучшить показатель Buffer Hit Rate. - [Механизм After-Imaging в OpenEdge](https://rupug.pro/courses/rdbms/the-after-imaging-in-openedge-mechanism/) - После изучения пособия у читателя формируется целостное представление о принципах работы After-Imaging, что позволяет овладеть базовыми навыками использования этого механизма в промышленных условиях. - [Разработка ABL-приложений](https://rupug.pro/courses/programming/development-of-abl-applications/) - Это поистине уникальное руководство откроет перед вами двери в увлекательный мир разработки с использованием языка программирования OpenEdge ABL. Вы сможете создать свои собственные бизнес-приложения, используя возможности, которые предлагает этот мощный инструмент. - [Основы настройки производительности OpenEdge](https://rupug.pro/courses/rdbms/101-3-tuning-openedge-database/) - Тренинг знакомит с основами настройки производительности и задачами мониторинга различных компонент работающей базы данных Progress OpenEdge - [Использование ProDataSet](https://rupug.pro/courses/programming/using-prodataset/) - Предлагаемый материал ориентирует студентов на проектирование и разработку приложений с использованием наборов данных ABL (ProDataSet). - [Введение в платформу OpenEdge для программистов](https://rupug.pro/courses/programming/openedge-for-programmers/) - Это первый курс серии, где вы впервые познакомитесь со средой разработки Progress Developer Studio for OpenEdge, а также узнаете о некоторых ключевых концепциях OpenEdge Reference Architecture (OERA). - [Программирование на OpenEdge ABL - Best Practices](https://rupug.pro/courses/programming/programming-on-openedge-abl-10-x-best-practices/) - Предполагается, что слушатель данного курса имеет некоторый опыт работы с OpenEdge, или, по крайней мере, знаком с базовыми основами программирования на ABL. - [Введение в OpenEdge Table Partitioning](https://rupug.pro/courses/rdbms/openedge-table-partitioning/) - Целью данного курса является изучение ключевых понятий и задач для выполнения секционирования таблиц в базах данных OpenEdge. - [Введение в Developer Studio for OpenEdge](https://rupug.pro/courses/programming/intro-pdsoe/) - На этом тренинге вы познакомитесь с ключевыми функциями Developer Studio и попрактикуетесь в их использовании. - [Работа с REST-сервисами в OpenEdge](https://rupug.pro/courses/programming/programming-rest-web-services/) - Тренинг предназначен для разработчиков решений на OpenEdge, которым необходимо создать свои REST-сервисы или взаимодействовать со сторонними REST-сервисами - [Введение в PAS for OpenEdge](https://rupug.pro/courses/rdbms/introduction-to-administration-pas-for-openedge/) - Тренинг представляет собой обзор сервера приложений Progress Application Server for OpenEdge (PAS for OpenEdge) для администраторов баз данных OpenEdge. - [Основы администрирования СУБД OpenEdge](https://rupug.pro/courses/rdbms/basics-administration-rdbms-openedge/) - По завершении этого курса и итогам тестирования студентам выдается полноценный действительный электронный сертификат. Поэтому во время регистрации рекомендуется указывать свои реальные данные. ## Уроки - [Настройка сервера PAS](https://rupug.pro/lessons/pas-tune-3-2/) - Ключевым этапом настройки экземпляра сервера PAS for OpenEdge является оптимизация распределения памяти в стеке, куче и permgen виртуальной машины Java (JVM), а также настройка системы управления памятью (сборщик мусора). Параметры конфигурации памяти напрямую влияют на производительность сервера PAS, определяя количество и тип веб-приложений, которые могут быть развернуты, а также максимальное число обслуживаемых клиентских подключений. Процесс - [Веб-приложение OpenEdge ABL](https://rupug.pro/lessons/pas-tune-2-5/) - Веб-приложения OpenEdge (oeabl.war), функционирующие в PAS, представляют собой стандартные веб-приложения Java, выполняющиеся в контексте HTTP-запроса, инициирующего поток PAS. Эти приложения обеспечивают интеграцию между HTTP-запросами и запросами ABL. Как и в случае с любыми другими веб-приложениями, каждый клиентский HTTP-запрос обрабатывается в отдельном потоке из пула потоков PAS. Веб-приложения ABL конфигурируются для использования процессорных ресурсов, памяти (кучи) - [Время инициализации PAS](https://rupug.pro/lessons/pas-tune-2-4/) - Время, необходимое для запуска и начала обработки клиентских запросов системой PAS, может представлять проблему в определенных условиях эксплуатации. Этот временной показатель может зависеть от количества и типа развернутых веб-приложений, а также от конфигурации каждого отдельного веб-приложения. Процесс загрузки веб-приложений в системе PAS осуществляется последовательно. В момент начала загрузки каждого веб-приложения администратор может регулировать количество сервлетов, - [Общий веб-сервер PAS](https://rupug.pro/lessons/pas-tune-2-3/) - В основе веб-сервера PAS для OpenEdge лежит платформа Progress Application Server (PAS), которая поддерживает большинство веб-приложений, соответствующих стандарту Java Servlet 3.0. PAS представляет собой адаптированную версию продукта Apache Tomcat, работающего в Java Virtual Machine (JVM). Это означает, что PAS зависит от конфигурации потоков процесса JVM, распределения памяти и операций ввода-вывода (файловых и сетевых). PAS и - [Виртуальная машина Java (JVM)](https://rupug.pro/lessons/pas-tune-2-2/) - Сервер PAS, предназначенный для размещения веб-приложений OpenEdge, функционирует в среде виртуальной машины Java (JVM). JVM обеспечивает комплексное управление ресурсами, включая управление памятью, потоковыми операциями и вводом-выводом. Эта программная инфраструктура играет ключевую роль в определении конфигурации сервера, существенно влияя на его производительность. Например, с помощью JVM регулируются параметры развертывания веб-приложений, количество поддерживаемых клиентских соединений и скорость - [Ограничения доступа к ресурсам для OpenEdge и системных процессов](https://rupug.pro/lessons/pas-tune-2-1/) - Ограничения доступа для OpenEdge и его дочерних компонентов реализуются в рамках системных процессов и, следовательно, зависят от установленных лимитов на ресурсы, такие как объем оперативной памяти и количество открытых файлов. В различных операционных системах (ОС) эти ограничения могут существенно различаться, поэтому для определения максимально допустимых настроек конфигурации PAS for OpenEdge необходимо учитывать специфику используемой ОС. - [Цели и ключевые этапы настройки PAS for OpenEdge](https://rupug.pro/lessons/pas-tune-3-1/) - После получения общего представления о среде PAS for OpenEdge, которая будет использоваться для выполнения вашего приложения ABL, можно приступить к процессу настройки. Настройка PAS for OpenEdge начинается с установки актуальной версии продукта. В среде разработки PAS for OpenEdge реализованы определенные ограничения, которые могут повлиять на эффективность настройки производительности. После установки продукта на рабочий сервер необходимо - [Рекомендации по быстрой настройке](https://rupug.pro/lessons/pas-tune-4-1/) - Для повышения производительности приложения можно настроить ряд параметров, которые оказывают непосредственное влияние на его функционирование в рабочей среде. Правильная конфигурация этих параметров может существенно улучшить эксплуатационные характеристики приложения. На представленном рисунке изображена схема конфигурации, при которой сервер и агенты приложений ABL не ограничивают количество подключений к базе данных, благодаря настройке экземпляра PAS for OpenEdge и - [От автора](https://rupug.pro/lessons/pas-tune-1/) - Progress Application Server for OpenEdge (PAS for OpenEdge) представляет собой веб-сервер, предварительно настроенный для обеспечения доступа к бизнес-приложениям, разработанным на языке Advanced Business Language (ABL), а также для предоставления веб-интерфейсов HTTP-клиентам в интернет- или интранет-средах. В отличие от классического сервера приложений Progress® OpenEdge®, который требует специфической конфигурации, управления и настройки, PAS for OpenEdge функционирует на - [Пул сеансов OpenEdge ABL и планирование запросов](https://rupug.pro/lessons/pas-tune-3-8/) - В данном разделе представлена информация, позволяющая управлять PAS во время, а также сеансами ABL, которые используются для обработки клиентских запросов и выполнения параллельных запросов от клиентов. Времени запуска и обработка начальных клиентских запросов SessionManager должен инициировать запуск по крайней мере одного MS-агента при запуске экземпляра PAS for OpenEdge. В процессе запуска MS-Agent, SessionManager приостанавливает свою - [Настройка веб-приложений OpenEdge и MS-Agent](https://rupug.pro/lessons/pas-tune-3-7/) - После завершения настройки PAS для обработки клиентских запросов можно приступить к работе с веб-приложениями OpenEdge и процессами MS-Agent. Далее представлена информация о следующих аспектах: Конфигурирование размера пула сеансов ABL в диспетчере сеансов ABL. Управление потреблением ресурсов в рамках многосессионного процесса агента. Контроль за одновременным выполнением запросов ABL. Настройка времени запуска PAS for OpenEdge. Разработка и - [Настройка функций сервера PAS](https://rupug.pro/lessons/pas-tune-3-6/) - Продукт PAS поставляется предварительно настроенным с определенными серверными функциями и фильтрами HTTP-запросов (известными как valves), которые активируются при каждом клиентском запросе. Стандартные конфигурации PAS по умолчанию эффективны в большинстве сценариев, однако некоторые функции и/или фильтры могут быть деактивированы для обеспечения безопасности или оптимизации времени обработки HTTP-запросов в зависимости от специфических требований. Для управления параметрами сервера - [Настройка обработки запросов PAS HTTP/HTTPS](https://rupug.pro/lessons/pas-tune-3-5/) - PAS обрабатывает все клиентские HTTP-запросы, включая OpenEdge, REST, SOAP и другие. Настройка одновременной обработки клиентских запросов подразумевает управление пулом потоков PAS и очередями HTTP-запросов. Основная цель заключается в оптимизации размера пула потоков таким образом, чтобы он эффективно обрабатывал максимальное количество клиентских запросов одновременно во всех веб-приложениях, соблюдая установленные ограничения конфигурации JVM. Свойство По умолчанию Описание - [Настройка сетевых подключений клиента PAS](https://rupug.pro/lessons/pas-tune-3-4/) - Настройка сетевых подключений клиента PAS предполагает управление HTTP-клиентом TCP/IP. Множество параметров сетевого подключения определены в файле конфигурации PAS /conf/catalina.properties как системные свойства Java, имеющие префиксы «psc.as.». Эти параметры могут быть настроены с использованием утилиты командной строки (рекомендуется) или текстового редактора. Каждое системное свойство Java, начинающееся с «psc.as.», в файле /conf/catalina.properties связано с элементом или атрибутом - [Настройка памяти JVM и сборки мусора](https://rupug.pro/lessons/pas-tune-3-3/) - Управление памятью в среде PAS (Apache Tomcat) и процесс сборки мусора являются ключевыми аспектами оптимизации производительности. Apache Tomcat может функционировать нестабильно при недостатке свободного пространства в областях heap и permgen. Для обеспечения доступности памяти необходимо регулярно инициировать процесс сборки мусора, который освобождает неиспользуемые ресурсы. Однако, каждый запуск сборщика мусора приостанавливает выполнение других потоков JVM, включая - [Введение](https://rupug.pro/lessons/pas-tune-2/) - Перед началом настройки сервера PAS for OpenEdge рекомендуется ознакомиться с его архитектурой, чтобы понять, как ваше приложение ABL взаимодействует с различными компонентами системы и где располагаются ключевые подсистемы. Архитектура сервера PAS for OpenEdge включает следующие основные подсистемы: Процессы операционной системы и их настройки. Виртуальная машина Java (JVM). Веб-сервер Apache Tomcat. Веб-приложение OpenEdge (файл oeabl.war). Многосессионный - [AI File Management](https://rupug.pro/lessons/ai-8/) - Механизм AI File Management предназначен для автоматического архивирования экстентов. Он функционирует в виде демона, запускаемого брокером базы данных. Механизм поддерживает два режима работы: «Временной» и «По требованию». В «Временном» режиме, при активации специального параметра, переключение экстентов осуществляется через заданный временной интервал, независимо от степени их заполнения. Минимальный интервал переключения составляет 120 секунд, а максимальный — - [Практическое занятие 8.1](https://rupug.pro/lessons/try-it-8-1/) - На этом занятии необходимо выполнить выгрузку описания данных, содержимого таблиц и значений секвенций из базы данных sports81. Используйте инструмент Data Administration. Содержимое таблиц необходимо выгрузить как в текстовом виде (.d), так и в бинарном (.bd). Дополнительно выполнить многопоточную бинарную выгрузку. В заключение выгрузить значения секвенций. Задание 1. Подготовка базы данных sports81 В первую очередь для - [Мониторинг в PROMON](https://rupug.pro/lessons/b2-6/) - В связи с внедрением Альтернативного буферного пула в системе были произведены соответствующие модификации в настройках утилиты PROMON, которые будут изложены ниже. Опция 5 – Activity Расширена строка Buffer Hits, теперь она имеет три значения: Buffer Hits, средний процент; Primary Hits, процент совпадений в первичном буферном пуле; Alternate Hits, процент совпадений в Альтернативном буферном пуле. Выглядит - [PROUTIL VIEWB2](https://rupug.pro/lessons/proutil-viewb2/) - Утилита PROUTIL в сочетании с классификатором VIEWB2 формирует отчет о областях и объектах, использующих альтернативный буферный пул. Синтаксис команды: proutil db-name -C viewb2 В областях типа SAT-II объекты могут работать с различными буферными пулами вне зависимости от типа буферного пула самой области. В связи с этим отчет включает информацию о каждом объекте области и используемом - [PROUTIL DISABLEB2](https://rupug.pro/lessons/proutil-disableb2/) - Утилита PROUTIL, использующая классификатор DISABLEB2, предназначена для деактивации альтернативного буферного пула, назначенного указанной области. Общий синтаксис команды имеет следующий вид: proutil db-name -C disableb2 area-name После выполнения данной команды, указанная область будет переключена на использование первичного буферного пула. Важно отметить, что данная команда может быть выполнена исключительно в режиме offline. Применение команды возможно только в - [PROUTIL ENABLEB2](https://rupug.pro/lessons/proutil-enableb2/) - Утилита PROUTIL ENABLEB2 предназначена для назначения альтернативного буферного пула области данных. Синтаксис утилиты имеет следующий вид: proutil db-name -C enableb2 area-name Для назначения области альтернативного буферного пула необходимо использовать параметр запуска базы данных –B2. В случае отсутствия данного параметра область будет использовать буферы из первичного буферного пула. Утилита PROUTIL с классификатором ENABLEB2 функционирует исключительно в - [Изменения в DF](https://rupug.pro/lessons/b2-8/) - Выгрузка и последующая загрузка файла описания данных (.df) сохраняет установленные параметры буферных пулов. В описание данных начиная с версии OpenEdge 10.2B был добавлен новый ключ – BUFFER-POOL. Поэтому, более ранние версии Progress не смогут использовать файл описания данных от версии 10.2B, так как это приведет к ошибкам. В трайлер описания данных так же была добавлена - [Изменения в VST](https://rupug.pro/lessons/b2-7/) - Некоторые системные виртуальные таблицы (VST) были модифицированы для поддержки альтернативного буферного пула. Ниже приведено описание изменений: Таблица _ActBuffer: - Добавлены три дополнительные записи. - Первая запись содержит информацию о деятельности обоих буферных пулов: первичного и альтернативного. - Вторая запись включает данные только о первичном буферном пуле. - Третья запись содержит информацию только об альтернативном буферном - [Выделение памяти под альтернативный буферный пул](https://rupug.pro/lessons/b2-5/) - После идентификации объектов или областей, которые будут использовать Альтернативный буферный пул, необходимо обеспечить выделение части общей памяти для данного пула. Это может быть выполнено с использованием параметра запуска базы данных «–B2 n», где n представляет собой количество блоков. Важно учитывать, что суммарное значение параметров «–B» и «–B2» не должно превышать максимально допустимый размер общей памяти. - [Просмотр списка объектов B2](https://rupug.pro/lessons/b2-4/) - Просмотреть перечень объектов, использующих альтернативный буферный пул, можно двумя способами: через словарь данных (Data Dictionary) или посредством утилиты PROUTIL. Просмотр через Data Dictionary С помощью Data Dictionary предоставляется возможность получить перечень объектов ABL, использующих альтернативный буферный пул на уровне объектов. Однако данный инструмент не позволяет просматривать назначения на уровне областей или SQL-объектов. Для получения списка - [Использование SQL для управления объектами базы данных](https://rupug.pro/lessons/b2-3/) - Администратор базы данных имеет возможность применять OpenEdge SQL Data Definition Language для создания и управления объектами базы данных, предназначенными для работы с альтернативным буферным пулом. Эта функция языка применима исключительно к таблицам, индексам и LOB-полям, размещённым в области хранения SAT-II. Оператор CREATE TABLE Для создания таблицы с указанием типа буферного пула, который должен использоваться в - [Назначение Альтернативного буферного пула областям и объектам](https://rupug.pro/lessons/setting-up-a-buffer-pool/) - Как уже упоминалось ранее, альтернативный пул буферов может быть использован как отдельными объектами базы данных, так и целыми областями хранения. Для назначения областей хранения на использование альтернативного пула буферов применяется утилита PROUTIL ENABLEB2. Для таблиц, индексов и LOB-объектов эта функция может быть активирована через меню Alternate Buffer Pool Maintenance в Data Administration или с использованием - [Введение](https://rupug.pro/lessons/b2-1/) - Альтернативный буферный пул представляет собой совокупность буферов в общей памяти, которые логически обособлены от основного буферного пула. Управление альтернативным буферным пулом осуществляется независимо от основного буферного пула. Назначение конкретных областей или объектов для использования альтернативного буферного пула позволяет повысить производительность системы за счет увеличения показателя Buffer Hit Rate. Это достигается путем оптимизации операций чтения и - [Применение параметра After-Image Stall (-aistall)](https://rupug.pro/lessons/ai-12/) - В случае, если все экстенты AI заполнены до состояния FULL и дальнейшее расширение не представляется возможным, при использовании экстентов фиксированного размера продолжение записи данных в текущий экстент со статусом BUSY также становится невозможным. Для обеспечения целостности данных система инициирует аварийное завершение работы базы данных. (3773) Cannot switch to after-image extent /openedge/117/wrk/testdb/sports.a1 it is full. (5350) - [Зачем нужен After-Imaging](https://rupug.pro/lessons/ai-1/) - Механизм After-imaging представляет собой инструмент для обеспечения дополнительной защиты базы данных. Его активация рекомендуется для всех систем, где информация обладает значительной ценностью. Перед внедрением After-imaging необходимо разработать и протестировать план резервного копирования и восстановления данных. После активации After-imaging начинается процесс журналирования всех транзакций, что позволяет восстановить состояние базы данных на любой момент времени. Основная цель - [Работа After-Image репликации](https://rupug.pro/lessons/ai-10-2/) - В данном примере демонстрируются методы настройки и запуска репликации с использованием технологии After-Image. Для этого применяются специально разработанные скрипты, которые могут быть адаптированы для использования в промышленной среде. Эффективность и надежность скриптов подтверждены многократными проверками в реальных условиях эксплуатации. Однако, несмотря на это, скрипты предоставляются на условиях "как есть", и пользователь принимает на себя все - [Восстановление базы данных из AI-архивов](https://rupug.pro/lessons/tryai-9/) - Для восстановления используйте тестовую базу данных sports. Но для начала в целях чистоты эксперимента перезапустите на ней After-imaging. Остановите базу данных: proshut ./sports -by Деактивируйте After-imaging командой PROUTIL AIMAGE END: proutil ./sports -C aimage end Очистите каталоги с AI-архивами: rm -f aiarch1/* Сформируйте полную резервную копию базы данных: probkup ./sports ./backup/sports-full.bak Активируйте After-Imaging: proutil ./sports - [Добавления AI-экстентов и реогранизация AI](https://rupug.pro/lessons/tryai-8/) - Для демонстрации работы утилиты PROSTRCT REORDER AI необходимо заполнить все AI-экстенты (статус FULL). Для того чтобы иметь возможность заполнить все AI-экстенты без автоматического переключения, деактивируйте AI File Management. rfutil sports -C aiarchiver disable Здесь мы не будем использовать параметр , т.к. в демонстрационных целях он не нужен. Структура AI-экстентов должна выглядеть так, т.е. используются AI-экстенты - [Мониторинг AI-экстентов](https://rupug.pro/lessons/tryai-3/) - RFUTIL AIMAGE EXTENT LIST Для просмотра состояния AI-экстентов выполните следующую команду: rfutil ./sports -C aimage extent list Информация о состоянии наших шести AI-экстентов будет выведена в следующем виде: Extent: 1 Status: Busy Type: Fixed Length Path: /dsk3/users/valeriy/lecAI/db1/sports.a1 Size: 2040 Used: 1 Start: Fri Jul 10 16:11:54 2009 Seqno: 1 Extent: 2 Status: Empty Type: Fixed - [Изменение параметров AI File Management](https://rupug.pro/lessons/tryai-7/) - Для установки нового каталога сохранения AI-архивов выполните следующую команду: rfutil ./sports -C aiarchiver setdir aiarch3/ Будет выведено сообщение: The after-image management daemon has been notified about the new archive directory. (13208) Теперь все новые AI-архивы будут размещаться в этот каталог. Для изменения интервала архивации установите его равным 2,5 минутам, для чего воспользуйтесь следующей командой: rfutil - [Активация AI File Management](https://rupug.pro/lessons/tryai-6/) - Offline Теперь, когда вы научились работать с After-Image в ручном режиме, научимся использовать автоматический режим, для этого выполните активацию механизма AI File Management для базы данных sports. Создайте два каталога, в которые должны сохраняться AI-архивы. Для демонстрационных целей создадим их в каталоге базы данных с именами aiarch1/ и aiarch2/, но в промышленной среде так делать - [Архивирование AI-экстентов](https://rupug.pro/lessons/tryai-5/) - На текущий момент после выполнения на тестовой базе sports утилиты RFUTIL AIMAGE NEW у нас есть два AI-экстента со статусом FULL. Поэтому, пока третий AI-экстент (статус BUSY) заполняется, мы должны заархивировать предыдущие заполненные экстенты и установить им статус EMPTY, чтобы они могли использоваться повторно. Для этого: Определите самый старший заполненный экстент с помощью RFUTIL AIMAGE - [Переключение AI-экстентов](https://rupug.pro/lessons/tryai-4/) - На этот момент в нашей базе текущим экстентом (статус BUSY) является второй экстент. Это видно из результатов выполнения команды RFUTIL AIMAGE EXTENT LIST, описанной в примере мониторинга AI-экстентов. Размер AI-данных в нём сейчас равен 836 Кб (Used: 836). С помощью команды RFUTIL AIMAGE EXTENT NEW зафиксируйте этот размер, выполнив переключение второго экстента в статус FULL, - [Активация After-Imaging](https://rupug.pro/lessons/tryai-2/) - Для выполнения практического задания воспользуйтесь созданной в предыдущем примере базой данных sports. Активация в Offline Для активации механизма After-imaging в offline выполним следующие действия: Остановите базу данных, если она еще работает: proshut ./sports -by Сформируйте резервную копию базы данных: probkup ./sports ./backup/sports-1.bak где ./backup/sports-1.bak - это файл, в котором будет сформирована резервная копия. Активируйте After-Imaging: rfutil - [Добавление AI-экстентов](https://rupug.pro/lessons/tryai-1/) - Рассмотрим два подхода к реализации AI-экстентов: Первый подход предполагает добавление AI-экстентов на этапе создания базы данных. Второй подход включает добавление AI-экстентов в уже существующую базу данных. Создание новой базы данных с AI-экстентами Перед созданием новой базы данных необходимо подготовить структурный файл, который будет содержать AI-экстенты. Для этого перейдите в каталог, в котором хотите поместить будущую - [Деактивация After-Imaging](https://rupug.pro/lessons/ai-11/) - Для деактивации механизма After-imaging используется утилита RFUTIL. Последовательность действий по деактивации выглядит следующим образом: Текущий используемый AI-экстент (статус BUSY) помечается как FULL. Копируются все заполненные экстенты (статус FULL). Это необходимо для того, чтобы не потерять данные в AI-экстентах, т.к. RFUTIL после деактивации пометит все экстенты как пустые, данные в них будут потеряны. Деактивируется After-imaging командой - [Восстановление базы данных из архивов AI-экстентов](https://rupug.pro/lessons/ai-10/) - Для выполнения Roll-forward Recovery (далее «накат AI-файлов») необходимы все архивы AI-экстентов, созданные после формирования последней резервной копии. Помните, что последний архив AI-экстента обычно является файлом, созданным в момент сбоя. Следовательно, он может содержать информацию, приведшую к этому сбою, поэтому лучше его не накатывать. Кроме того, если какой-то из файлов был потерян, то восстановление будет возможным - [Добавление и реорганизация AI-экстентов](https://rupug.pro/lessons/ai-9/) - Добавление AI-экстента может потребоваться в том случае, когда невозможно выполнить переключение экстентов из-за их заполненности и невозможно перевести любой из них в состояние EMPTY. В такой ситуации база данных либо будет остановлена, либо ее активность будет заморожена, при условии, что при старте был указан параметр After-image stall (-aistall). По заявленной в документации по OpenEdge схеме - [Управление After-Image экстентами](https://rupug.pro/lessons/ai-7/) - Как уже упоминалось ранее, статус AI-экстентов может принимать различные значения. Рассмотрим порядок смены этих статусов: EMPTY - AI-экстент пустой и доступен для использования; BUSY - AI-экстент, которые заполняется в текущий момент; FULL - во время переключения AI-экстентов, статус текущего экстента (BUSY) меняется на заполненный (FULL), а следующий пустой экстент (EMPTY) становится текущим (BUSY); LOCKED - - [Активация After-Imaging](https://rupug.pro/lessons/ai-6/) - Команды для выполнения активации After-imaging в различных режимах работы базы данных. В Offline Для активации After-imaging необходимо использовать параметр AIMAGE BEGIN утилиты RFUTIL. Перед этим необходимо сформировать полную резервную копию базы данных, т.к. AI-файлы и полная резервная копия используются совместно для восстановления базы. Для активации в offline необходимо: cформировать полную резервную копию; воспользоваться следующей командой - [Создание After-Image экстентов](https://rupug.pro/lessons/ai-5/) - Создать AI-экстенты можно с помощью утилиты PROSTRCT и структурного файла. При создании новой базы используется команда PROSTRCT CREATE, а для добавления AI-экстентов в существующую базу – PROSTRCT ADD/ADDONLINE. Добавление AI-экстентов во время создания новой базы данных: Cоздайте структурный файл, опишите BI экстенты, опишите экстенты областей хранения данных, опишите необходимое количество AI-экстентов фиксированного размера. Экстенты описываются - [Расчет размеров фиксированных AI-экстентов](https://rupug.pro/lessons/ai-4/) - После определения объема генерируемых After-image данных можно поменять размеры AI-экстентов. Рекомендуется размер одного экстента задавать достаточно большим, чтобы вместить минимум четыре часа типичной деятельности базы данных. Общий размер всех экстентов должен вместить информацию как минимум за одну неделю. Такие рекомендации основываются на следующем: размеры экстентов должны учитывать время возможного простоя базы данных target (OE Replication); - [Оценка дискового пространства для AI-экстентов](https://rupug.pro/lessons/ai-3/) - Перед активацией функции After-imaging необходимо провести тщательную оценку необходимого дискового пространства для хранения всех AI-экстентов базы данных. В случае, если при использовании экстентов переменного размера произойдет исчерпание дискового пространства и не будет доступен пустой экстент (статус EMPTY), база данных будет принудительно остановлена. Для предотвращения данной ситуации рекомендуется использовать параметр старта при запуске базы данных, который - [Экстенты After-Imaging](https://rupug.pro/lessons/ai-2/) - В базе данных количество AI-экстентов ограничено максимальным числом областей хранения, поддерживаемых системой OpenEdge. Каждый AI-экстент представляет собой отдельную область с уникальным порядковым номером. Для обеспечения отказоустойчивости и надежности системы минимальное количество AI-экстентов должно составлять три. AI-экстенты содержат последовательности заметок, организованные в AI-блоки. Эти заметки используются механизмом roll-forward для восстановления базы данных до состояния, предшествующего её - [Итоги практического занятия](https://rupug.pro/lessons/task-7-4/) - В рамках данного практического занятия вами был приобретен начальный опыт программирования на языке ABL, что позволило освоить управление логикой выполнения программы. В ходе работы были изучены различные типы блоков, которые могут быть интегрированы в код ABL, выполняемый как в клиентских, так и в серверных приложениях. В дальнейшем планируется более детальное рассмотрение использования блоков типа for - [Задание 3. Написание кода для выхода из итерации](https://rupug.pro/lessons/task-7-3/) - Допустим, вам необходимо разработать программу, которая будет считать количество заказов на товар с определённым номером. Наша задача — определить, было ли отгружено более 200 единиц товара с номером 46. Программа, которую вы создадите, будет перебирать все записи в строке заказа. Она подсчитает количество товаров с номером 46, которые были заказаны. Наша цель – выяснить, превышает - [Задание 1. Написание кода для выполнения итерации](https://rupug.pro/lessons/task-7-1/) - В процессе разработки программного обеспечения с использованием языка ABL программисты применяют различные инструкции для управления логикой выполнения приложения. Данное практическое занятие направлено на освоение базовых принципов реализации логики бизнес-сущности. Упражнение состоит из трёх последовательных заданий. Общая продолжительность выполнения всех заданий составляет приблизительно 45 минут. Для анализа заказов клиентов по странам и создания статистической отчетности в - [Задание 2. Написание кода для использования оператора case](https://rupug.pro/lessons/task-7-2/) - В рамках данного задания необходимо разработать программную процедуру, предназначенную для анализа данных о заказах клиентов в информационной системе. Основная функция процедуры заключается в суммировании общей стоимости заказов для каждого клиента. Процедура должна учитывать особенности заказов, связанных с определенными странами, и выполнять следующие действия: При обнаружении заказов клиентов из США процедура должна отображать итоговые данные о - [Контроль итерации](https://rupug.pro/lessons/part-7-4/) - В предыдущих разделах рассматривалось использование итерации, интегрированной в функциональность блока FOR EACH. Итерация в этом блоке автоматически прекращается при отсутствии доступных записей. Однако также возможно выполнение итерации с использованием блока DO. В этом случае необходимо предусмотреть программный механизм, обеспечивающий завершение итерационного процесса внутри блока DO. Для завершения итерации в блоке можно использовать два подхода: Повторение - [Условное выполнение](https://rupug.pro/lessons/part-7-3/) - В рамках предыдущих уроков данного курса были рассмотрены методы применения конструкции if/then для проверки выполнения условий и последующей реализации соответствующих блоков кода. В частности, анализировалась конструкция, в которой условие проверяется, и в случае его истинности инициируется выполнение блока DO. Важно отметить, что в данном контексте продемонстрирован пример вложенного оператора IF внутри блока DO: IF LogFile - [Написание ABL-блоков](https://rupug.pro/lessons/part-7-2/) - Блок ABL представляет собой последовательность инструкций, объединенных в рамках метода или процедуры. Он инициируется управляющей конструкцией, такой как «for» или «do», и завершается инструкцией «end». Вложенный характер блоков позволяет организовывать многоступенчатые алгоритмы, где каждый уровень вложенности соответствует отдельной итерации. Блок ABL выполняет повторяющиеся действия на основе заданного условия. Для итерации по временным таблицам или таблицам - [Введение](https://rupug.pro/lessons/part-7-1/) - В рамках данного курса вы освоили базовые механизмы управления выполнением программ с использованием инструкций ABL. В частности, были рассмотрены конструкции "if/then" и "for each", которые обеспечивают ветвление и повторение операций соответственно. На этом уроке будет представлено более глубокое изучение принципов управления логикой выполнения программ. Во-первых, будет рассмотрено использование блоков для организации последовательностей инструкций. Затем будет - [Итоги практического занятия](https://rupug.pro/lessons/task-6-5/) - В рамках данного курса вы освоили базовые механизмы управления выполнением программ с использованием инструкций ABL. В частности, были рассмотрены конструкции "if / then" и "for each", которые обеспечивают ветвление и повторение операций соответственно. В текущем учебном модуле будет представлено более глубокое изучение принципов управления логикой выполнения программ. Во-первых, будет рассмотрено использование блоков для организации последовательностей - [Задание 4. Использование объекта Query для динамической временной таблицы](https://rupug.pro/lessons/task-6-4/) - В рамках этого задания, после разработки программного кода для генерации динамической временной таблицы на основе статической временной таблицы, необходимо разработать алгоритм для последовательного перебора записей в динамической временной таблице с использованием объекта Query. В процедуру WorkWithDynamicTempTable.p будет добавлен дополнительный программный код. При этом будет осуществлено повторное использование программного кода, разработанного для процедуры QueryOrders.p, с целью - [Задание 3. Создание динамической временной таблицы](https://rupug.pro/lessons/task-6-3/) - В рамках данного задания необходимо создать динамическую временную таблицу, являющуюся подмножеством временной таблицы ttOrder из набора данных. Создайте новую процедуру под названием WorkWithDynamicTempTable.pв папке WorkWithABLDataTypes. Добавьте код из файла FindRecords.p, который содержит определение набора данных и осуществляет считывание данных JSON в указанный набор данных: /* *************************** Definitions ************************** */ BLOCK-LEVEL ON ERROR UNDO, THROW. {include/dsCustomerBE.i} - [Задание 2. Создание и использование объекта Query](https://rupug.pro/lessons/task-5-2-2/) - В рамках данного задания требуется разработать программный код, который создаст объект Query, предназначенный для выполнения итерационных операций. Создайте новую процедуру под названием QueryOrders.p в папке WorkWithABLDataTypes. Для создания новой ABL-процедуры выполните следующие шаги: В Project Explorer найдите папку WorkWithABLDataTypes. Щелкните по ней правой кнопкой мыши. В контекстном меню выберите пункт New и затем ABL Procedure. - [Задание 1. Поиск записи во временной таблице](https://rupug.pro/lessons/task-6-1/) - В рамках данного занятия необходимо разработать программный код на языке ABL для выполнения операций с временной таблицей. Основные этапы включают: Создание кода для доступа к данным временной таблицы с целью поиска конкретной записи. Разработка кода для формирования и использования объекта запроса, предназначенного для навигации по записям временной таблицы. Создание динамической временной таблицы с последующим копированием - [Подведение итогов](https://rupug.pro/lessons/summarizing/) - Вы завершили учебный курс «Основы администрирования СУБД OpenEdge». Мы рассказали вам об основных аспектах администрирования баз данных OpenEdge без знания и умения работать с которыми не обходится ни один администратор баз данных. Вы изучили архитектуру СУБД OpenEdge и различные инструменты для администрирования баз данных. Научились создавать, стартовать и останавливать базы данных, управлять экстентами базы данных, - [Просмотр пользовательской активности](https://rupug.pro/lessons/advdba-6-8/) - OpenEdge Management может использоваться для мониторинга пользовательской активности. Для просмотра пользовательской активности необходимо перейти по ссылке User Activity на странице управления базой данных. Откроется страница с различной информацией по пользователям. Первая вкладка Database Connections представляет собой список всех подключённых к базе данных пользователей на текущий момент, включая детальную информацию о пользовательских процессах. С помощью фильтров - [Просмотр ресурсов памяти](https://rupug.pro/lessons/advdba-6-7/) - Для мониторинга использования буферов базы данных необходимо перейти по ссылке Memory Resources на странице Database detail, откроется страница с информацией о ресурсах памяти базы данных. Здесь важным параметром является Used Buffers %, который находится в секции Buffers summary. Необходимо контролировать, чтобы значение Used Buffers держалось не ниже 95%. Чем выше, тем доступ к базе данных - [Просмотр BIW, AIW, APW и контрольных точек](https://rupug.pro/lessons/advdba-6-6/) - Фоновые процессы, таких как BIW, AIW и APW, способствуют повышению производительности базы данных за счёт непрерывной записи буферов BI и AI, а также буферов базы данных на диск. Контрольные точки уменьшают время восстановления базы данных в случае сбоя. В связи с этим, мониторинг активности данных процессов и частоты контрольных точек является важным аспектом обеспечения надёжности - [От автора](https://rupug.pro/lessons/от-автора/) - [Перед тем как начать](https://rupug.pro/lessons/advdba-tryit-1-1/) - В рамках данного практического занятия будет осуществлена оценка и определение оптимальных параметров хранения для тестовой базы данных ADBA1, входящей в состав прилагаемого архива с примерами. Программа занятия включает три последовательных этапа: Применение утилиты TABANALYS для определения среднего размера записи. Расчет оптимального количества записей в блоке. Выбор наиболее подходящего максимального количества записей в блоке, соответствующего установленным - [От автора](https://rupug.pro/lessons/advdba-7-2/) - Здравствуйте! Меня зовут Валерий Григорьевич Башкатов, и я хотел бы выразить вам признательность за участие в одном из наших обучающих мероприятий. Надеюсь, полученные знания оказались для вас ценными. Если вам понравился тренинг, я хотел бы попросить вас рассмотреть возможность поддержки нашего проекта. Вот несколько способов, как вы можете помочь: Поделитесь информацией о тренинге в социальных - [Подведение итогов](https://rupug.pro/lessons/advdba-7-1/) - В ходе данного тренинга были рассмотрены методологии управления базами данных с целью оптимизации их производительности и эффективного решения проблем, связанных с потенциальными повреждениями данных. Для более глубокого погружения в область администрирования системы управления базами данных OpenEdge рекомендуется обратиться к материалам тренинга «Основы настройки производительности OpenEdge». Ваши комментарии, замечания и предложения по представленному учебному материалу, а - [Просмотр областей хранения](https://rupug.pro/lessons/advdba-6-5/) - Мониторинг областей хранения необходим для контроля их размеров и обеспечения достаточного пространства для текущих и будущих данных. Информация об использовании областей хранения доступна на странице Database Storage Areas в разделе Operational Views по ссылке Storage Areas. На этой странице представлены данные о четырех категориях областей хранения. System areas – области для хранения системной информации, как - [Просмотр общих деталей](https://rupug.pro/lessons/advdba-6-4/) - Для администратора базы данных критически важно регулярно создавать резервные копии данных. Эффективное управление этим процессом требует знания времени последнего резервного копирования, а также типа копии (полная или инкрементальная). Соответствующая информация доступна на странице Database Performance Summary, находящейся в разделе Operational Views по ссылке Performance Summary. На странице Database Performance Summary в секции Database Summary доступна - [Просмотр журнала базы данных](https://rupug.pro/lessons/advdba-6-3/) - Файл журнала базы данных является текстовым документом, который фиксирует последовательность значимых событий и изменений параметров базы данных. В журнале отражены параметры запуска, даты и время начала и завершения работы, сообщения о системных ошибках, а также данные об активности различных утилит и пользователей. Расширение файла — «.lg». Записи в журнале позволяют проводить анализ событий, предшествовавших сбоям - [Добавление базы данных в OE Management](https://rupug.pro/lessons/advdba-6-2/) - Для интеграции базы данных в качестве управляемого ресурса в системе OpenEdge Management используется следующая процедура. Шаг Действие 1 Запустите консоль OpenEdge Management (Start -> All Programs -> Progress -> Management Console). Примечание: также можно ввести адрес http://localhost:9090 в веб-браузере. 2 Выберите Resources -> New -> Database. Откроется страница Database Migration Utility. 3 В секции Database - [Введение](https://rupug.pro/lessons/advdba-6-1/) - Важным аспектом деятельности администратора баз данных является мониторинг компонентов функционирующей базы данных для обеспечения её корректной работы. В рамках данного учебного материала рассматриваются методы мониторинга баз данных OpenEdge, а также процедура добавления базы данных в качестве ресурса для контроля через OpenEdge Management. Далее изучаются возможности OpenEdge Management по мониторингу ключевых метрик базы данных, управлению областями - [Выгрузка данных из таблицы с повреждёнными индексами](https://rupug.pro/lessons/advdba-5-4/) - В случае, если процесс перестроения индексов был прерван из-за физического повреждения данных, существует возможность восстановления данных из таблицы. Для этого используется специальная ABL-процедура, предназначенная для выгрузки данных по ROWID с пропуском поврежденных записей. Существует два метода выполнения данной процедуры: Если таблица имеет… То выгружайте таблицу … … как минимум один индекс, который может использоваться для - [Исправление физических повреждений индекса](https://rupug.pro/lessons/advdba-5-3/) - Физическое повреждение индекса в базе данных возникает вследствие нарушения внутренней структуры B-дерева. Это может произойти при наличии ошибок в организации данных, что приводит к искажению или утрате информации в индексе. Повреждение индекса может проявляться в виде сообщений об ошибках, таких как «Bad or invalid compression size» (некорректный или недопустимый размер сжатия) или «db key doesn’t - [Исправление логических индексных повреждений](https://rupug.pro/lessons/advdba-5-2/) - Логическое повреждение индекса возникает при наличии в индексе отсутствующих или избыточных идентификаторов строк (ROWID/RECID). Это может происходить в следующих случаях: В базе данных существует индексный ключ, который не соответствует записи в таблице. В таблице присутствует запись, для которой не существует соответствующего индексного ключа. Индексный ключ ссылается на запись, которая не принадлежит данной таблице или является - [Введение](https://rupug.pro/lessons/advdba-5-1/) - Индексы в базах данных могут подвергаться повреждениям по различным причинам, включая ошибки в программном обеспечении приложений, системные сбои или неисправности аппаратных компонентов. Отсутствие регулярных проверок состояния индексов может привести к длительному скрытому существованию повреждённых структур, пока пользователи не столкнутся с ошибками, указывающими на наличие проблемы. Обнаружение повреждения индекса может произойти в критические моменты, например, при - [Задание 4.2 Выгрузка данных вокруг блоков базы](https://rupug.pro/lessons/advdba-tryit-4-3/) - В этом задании необходимо: Выгрузить данных из таблицы Employee. Открыть файл RECID.txt для проверки ID выгруженных записей. Определить RECID записи с которой следует возобновить выгрузку. Изменить программу DumpEmployeeData.p для выгрузки записей на основе значения из предыдущего шага. Выполнить процедуру и проверить файлы employee.d и RECID.txt для подтверждения правильной выгрузки записей. Выполните старт базы данных dbfixdb2 - [Задание 4.1 Поиск физических повреждений](https://rupug.pro/lessons/advdba-tryit-4-2/) - В этом задании необходимо создать базу данных dbfixdb2 на основе стандартной тренировочной базы данных sports2000 и затем проверить эту базу на наличие повреждённых блоков. Перед выполнением задания убедитесь, что в Proenv вы находитесь в каталоге C:\progress_education\OpenEdge\ADBA\tryit\Lesson03. Создайте базу данных dbfixdb2 на основе базы данных sports2000: prodb dbfixdb2 sports2000 Проверьте базу данных dbfixdb2 на наличие повреждённых - [Введение](https://rupug.pro/lessons/advdba-tryit-4-1/) - В рамках настоящего практического занятия участники будут совершенствоваться в методах идентификации и устранения физических повреждений в структурах баз данных. Временные рамки для выполнения заданий составляют тридцать минут. - [Повреждение записи](https://rupug.pro/lessons/advdba-4-3/) - Повреждение записи представляет собой нарушение целостности одной или нескольких записей в блоке базы данных. Для предотвращения негативных последствий и оперативного восстановления данных администратору базы данных рекомендуется осуществлять систематический мониторинг журнала базы данных. Это позволяет своевременно выявлять сообщения об ошибках, связанных с повреждением записей, и принимать соответствующие меры по их устранению. Примеры сообщений об ошибках: SYSTEM - [Повреждение блока базы данных](https://rupug.pro/lessons/advdba-4-2/) - Для анализа природы повреждения блока данных необходимо рассмотреть последовательность этапов, через которые проходит каждый блок данных при его обращении из приложения. Фаза считывания: Блок данных извлекается из файла на диске и загружается в разделяемую память. Фаза обработки: В оперативной памяти осуществляются различные операции с данными, содержащимися в блоке. Фаза фиксации: Изменения, внесённые в блок данных, - [Введение](https://rupug.pro/lessons/advdba-4-1/) - В базе данных можно выделить три типа физических повреждений: Повреждение блока данных. Повреждение записи. Повреждение индекса. Регулярный мониторинг состояния базы данных и оперативное устранение выявленных физических повреждений является ключевой задачей администратора базы данных. В рамках данного урока рассматриваются методы устранения повреждений блока данных и записей. Методы исправления повреждений индекса будут рассмотрены в отдельном уроке. - [Задание 3.3 Исправление ситуации, вызванной потерей экстентов](https://rupug.pro/lessons/advdba-tryit-3-4/) - В рамках данного задания необходимо симулировать потерю нескольких экстентов базы данных и принять меры для восстановления доступа к оставшимся данным после запуска базы данных. Симулируйте потерю экстентов dbfixdb_12.d1, dbfixdb_12.d2 и dbfixdb_12.d3, удалив их из каталога C:\progress_education\OpenEdge\ADBA\tryit\archives. del ..\archives\dbfixdb_12.d1 del ..\archives\dbfixdb_12.d2 del ..\archives\dbfixdb_12.d3 Попробуйте выполнить старт базы данных dbfixdb: proserve dbfixdb -S 4002 Старт базы данных - [Задание 3.2 Обновление устаревшего файла базы данных с расширением .db](https://rupug.pro/lessons/advdba-tryit-3-3/) - В данном задании требуется смоделировать ситуацию несоответствия содержимого файла базы данных фактическому расположению экстентов данных. После этого необходимо принять меры для устранения данного несоответствия. Смоделируйте устаревание файла базы данных, выполнив перенос экстентов dbfixdb_12.d1, dbfixdb_12.d2 и dbfixdb_12.d3 в каталог C:\progress_education\OpenEdge\ADBA\tryit\archives. move dbfixdb_12.d1 ..\archives move dbfixdb_12.d2 ..\archives move dbfixdb_12.d3 ..\archives Попробуйте выполнить старт базы данных dbfixdb: proserve - [Задание 3.1 Восстановление повреждённого файла базы данных с расширением .db](https://rupug.pro/lessons/advdba-tryit-3-2/) - В этом задании необходимо создать новую базу данных с именем dbfixdb. Затем имитировать повреждение файла. И в завершение выполнить пересоздание повреждённого файла dbfixdb.db. Перед выполнением задания убедитесь, что в Proenv вы находитесь в каталоге C:\progress_education\OpenEdge\ADBA\tryit\Lesson03. В каталоге C:\progress_education\OpenEdge\ADBA\tryit\Lesson03 создайте базу данных dbfixdb, используя структурный файл targetDB.st и резервную копию targetDBbck. copy ..\Lesson02\targetDB.st dbfixdb.st prorest dbfixdb - [Введение](https://rupug.pro/lessons/advdba-tryit-3-1/) - На данном практическом занятии будут рассмотрены методы решения проблем, связанных с повреждением структуры базы данных. Продолжительность выполнения всех заданий составляет 30 минут. В рамках занятия будут выполнены следующие задачи: Восстановление повреждённого файла базы данных с расширением .db. Обновление устаревшего файла базы данных с расширением .db. Исправление ситуации, вызванной потерей экстентов. - [Исправление структурных повреждений](https://rupug.pro/lessons/advdba-3-3/) - Структурные повреждения базы данных могут возникать в следующих ситуациях: Повреждение файла базы данных (.db-файл). Устаревание файла базы данных. Рассинхронизация временных меток между файлами Before-Image (BI) и основным файлом базы данных. Потеря экстентов данных. В случае возникновения любого из указанных событий запуск базы данных становится невозможным. В данной части учебного материала рассматриваются методы устранения подобных повреждений. - [Типы повреждений](https://rupug.pro/lessons/advdba-3-2/) - В базе данных выделяются три основных типа повреждений: логические, структурные и физические. Логические повреждения обусловлены несоответствиями между логикой приложения и данными, хранящимися в базе. Примером может служить ситуация, когда данные удаляются из родительской таблицы без предварительной очистки связанных записей в дочерних таблицах, что приводит к появлению «сиротских» данных в дочерних таблицах и отсутствию соответствующих записей - [Введение](https://rupug.pro/lessons/advdba-3-1/) - В системах управления базами данных Progress OpenEdge случаи повреждения данных, приводящие к их утрате или недоступности, являются редкими событиями. Тем не менее, для администратора базы данных важно обладать знаниями о методах восстановления данных при возникновении подобных ситуаций. В данном учебном материале рассматриваются различные типы повреждений данных в СУБД Progress OpenEdge и методы их устранения. - [Подведение итога](https://rupug.pro/lessons/advdba-tryit-2-7/) - В рамках второго урока были рассмотрены сценарии миграции баз данных OpenEdge, параметры оптимизации производительности миграционных процессов, а также приобретены практические навыки выполнения миграции баз данных посредством методов двоичной выгрузки и загрузки данных с последующей переиндексацией таблиц. На последующем занятии планируется изучение типовых повреждений баз данных, возникающих в ходе их эксплуатации, а также освоение методик их - [Задание 2.5 Построение индексов](https://rupug.pro/lessons/advdba-tryit-2-6/) - В заключительной части занятия необходимо выполнить построение индексов таблицы Employee в базе данных targetDB. Поскольку построение индексов возможно только в оффлайн, то первым делом остановите базу данных targetDB: proshut targetDB -by Сформируйте резервную копию базы данных targetDB, так как в случае сбоя во время переиндексации наличие копии будет единственной возможностью восстановления базы: probkup targetDB targetDB1.bck - [Задание 2.4 Двоичная загрузка данных](https://rupug.pro/lessons/advdba-tryit-2-5/) - Теперь вы готовы выполнить двоичную загрузку данных таблицы Employee, которые хранятся в файле Employee.bd, в базу данных targetDB. Для этого выполните следующую команду: proutil targetDB -C load Employee.bd В результате выполнения команды двоичной загрузки на экран будет выведена следующая информация: Binary Dump created on Tue Aug 15 14:52:46 2017 from database C:\progress_education\openedge\ADBA\tryit\Lesson02\advdb2. (6203) Loading table - [Задание 2.3 Старт целевой базы данных](https://rupug.pro/lessons/advdba-tryit-2-4/) - Перед тем как приступить к двоичной загрузке данных необходимо соответствующим образом сконфигурировать базу данных targetDB. Остановите базу данных targetDB: proshut targetDB -by Измените параметры BI-файла для улучшения производительности. Установите размер BI-блока равным 16 Кб, а размер BI-кластера равным 16 Мб: proutil targetDB -C truncate bi -biblocksize 16 -bi 16384 Выполните старт базы данных targetDB со - [Задание 2.2 Двоичная выгрузка данных из исходной базы](https://rupug.pro/lessons/advdba-tryit-2-3/) - Задание: Создать отчёты с анализом базы данных и анализом индексов для того, чтобы найти номер индекса EmpNo таблицы Employee базы данных advdb Выполнить двоичную выгрузку данных из таблицы Employee. Создайте отчёт с анализом исходной базы данных и сохраните его в файл advdb2dbnalys.txt: proutil advdb2 -C dbanalys > advdb2dbanalys.txt Проверьте наличие файла в каталоге C:\progress_education\OpenEdge\ADBA\tryit\Lesson02. Создайте - [Задание 2.1 Создание стартовой версии целевой базы данных](https://rupug.pro/lessons/advdba-tryit-2-2/) - Задание: Создать структурный файл targetDB.st. Создать базу данных targetDB Выгрузить все описания из базы данных advdb2 Загрузить описания в базу данных targetDB. Для выполнения задания убедитесь, что в Proenv вы находитесь в каталоге C:\progress_education\OpenEdge\ADBA\tryit\Lesson02. Создайте структурный файл для целевой базы данных: Откройте для редактирования файл advdb2.st, который находится в каталоге C:\progress_education\OpenEdge\ADBA\tryit\Lesson02. Для каждой области хранения - [Введение](https://rupug.pro/lessons/advdba-tryit-2-1/) - Для осуществления процедуры двоичной выгрузки и загрузки данных необходимо выполнить следующие шаги: Создать стартовую версию целевой базы данных. Провести двоичную выгрузку данных из исходной базы данных. Запустить целевую базу данных. Выполнить двоичную загрузку данных в целевую базу данных. Перестроить индексы. В рамках данного практического занятия будет осуществлена тренировка выполнения вышеуказанных задач. Общее время на выполнение - [Введение](https://rupug.pro/lessons/advdba-2-1/) - Миграция базы данных может осуществляться в режиме онлайн, однако перед началом процедуры она должна быть переведена в режим только для чтения. Это необходимо для предотвращения внесения изменений в данные во время процесса миграции, что могло бы привести к рассинхронизации между исходной и целевой базами данных. Таким образом, сокращение времени выполнения миграции является приоритетной задачей. В - [Построение индексов](https://rupug.pro/lessons/advdba-2-5/) - Построение индексов – это финальная задача миграции базы данных с использованием двоичной выгрузки и загрузки. Построение индексов можно выполнить как вовремя, так и после завершения процессов загрузки данных. Однако, если это делать во время загрузки, то добавляются накладные расходы и производительность процессов значительно снижается. Поэтому рекомендуется выполнять построение индексов только после завершения загрузки данных. Для - [Реализация двоичной выгрузки и загрузки данных](https://rupug.pro/lessons/advdba-2-4/) - Как вы только что узнали, двоичную выгрузку и загрузку данных можно выполнить для одной и той же базы данных, но на этом уроке мы рассмотрим вариант миграции данных из исходной в целевую базу. Для реализации двоичной выгрузки и загрузки необходимо выполнить следующие задачи: Создать целевую базу данных. Выполнить двоичную выгрузку данных из исходной базы. Стартовать - [Варианты миграции базы данных](https://rupug.pro/lessons/advdba-2-3/) - В целях повышения производительности баз данных применяются три основных метода миграции данных: Текстовая выгрузка и массовая загрузка данных. Копирование через буферы. Двоичная выгрузка и загрузка. Текстовая выгрузка и массовая загрузка данных Один из методов переноса базы данных включает выгрузку данных из исходной базы с использованием инструментов администрирования баз данных, а затем их массовую загрузку в - [Сценарии миграции](https://rupug.pro/lessons/advdba-2-2/) - Существует четыре основных сценария, при которых требуется миграция базы данных: Переход на новую версию OpenEdge. Адаптация базы данных к 64-битной архитектуре. Перенос базы данных на другую операционную систему. Оптимизация производительности базы данных. В данном разделе представлены общие сведения о перечисленных сценариях. Основная часть урока будет посвящена детальному рассмотрению четвертого сценария — миграции для повышения производительности - [Подведение итога](https://rupug.pro/lessons/advdba-tryit-1-5/) - На этом практическом занятии были определены параметры RPB (Records Per Block) для областей, предназначенных для хранения прикладных данных. Эти параметры могут быть применены для создания новой производственной базы данных. Процесс включает модификацию структурного файла базы данных ADBA1, сохранение файла под новым именем и последующую генерацию новой базы данных на основе модифицированного файла. - [Задание 1.3 Выбор наилучшего допустимого количества записей в блоке](https://rupug.pro/lessons/advdba-tryit-1-4/) - В данном задании необходимо определить оптимальное количество записей в блоке для каждой области хранения. В системе OpenEdge предусмотрены следующие возможные значения RPB: 1, 2, 4, 8, 16, 32, 64, 128 и 256. Для иллюстрации рассмотрим область хранения "Employee". В результате анализа было установлено оптимальное значение RPB, равное 34. В соответствии с установленными правилами, необходимо выбрать - [Задание 1.2 Расчёт оптимального количества записей в блоке](https://rupug.pro/lessons/advdba-tryit-1-3/) - В данном задании требуется произвести расчёт оптимального количества записей в блоке для каждой области хранения прикладных данных при условии, что размер блока базы данных составляет 4 килобайта. Определите доступное пространство в блоке базы данных по следующей формуле: Available space per block = database block size – header size – create limit 4096 – 80 – - [Задание 1.1 Определение среднего размера записи](https://rupug.pro/lessons/advdba-tryit-1-2/) - В рамках данного задания необходимо провести анализ с использованием инструмента TABANALYS, чтобы определить средний размер записи в таблице с наибольшим объемом данных в каждой области хранения базы данных adba1. Откройте Proenv и перейдите в каталог C:\progress_education\OpenEdge\ADBA\tryit\Lesson01 Сгенерируйте отчёт с анализом таблиц базы данных adba1 с сохранением результата в файл adba1.txt: proutil adba1 -C tabanalys > - [Сайзинг областей хранения After-Image](https://rupug.pro/lessons/advdba-1-6/) - В системе управления базами данных OpenEdge применяется технология After-Image для хранения информации о транзакциях в виде AI-заметок. При проектировании базы данных важно корректно определить размеры AI-областей. Каждая AI-область состоит из одного AI-экстента, поэтому под сайзингом AI-областей подразумевается определение размеров AI-экстентов. Чтобы определить размеры AI-экстентов, необходимо ответить на следующие вопросы: Использовать ли экстенты фиксированного или переменного - [Сайзинг области хранения Before-Image](https://rupug.pro/lessons/advdba-1-5/) - Система управления базами данных OpenEdge использует область хранения Before-Image (BI-область) для записи заметок о всех транзакциях базы данных. Эти заметки предназначены для восстановления данных в случае сбоев, обеспечивая их целостность и достоверность. В связи с этим, корректная настройка данной области хранения имеет важное значение. Область хранения Before-Image в базе данных всегда представляет собой единый логический - [Сайзинг областей хранения прикладных данных](https://rupug.pro/lessons/advdba-1-4/) - Оптимизация хранения данных представляет собой ключевой аспект обеспечения эффективности функционирования базы данных. При определении размера областей хранения данных следует принимать во внимание количество записей, которые будут в них размещены. Это позволит оптимизировать процесс хранения и обработки данных. Для обеспечения эффективного хранения данных в базе необходимо определить максимальное количество записей в блоке для каждой области хранения. - [Обзор физических компонент базы данных](https://rupug.pro/lessons/advdba-1-3/) - Для корректного определения параметров базы данных необходимо ознакомиться с архитектурой и функциональными компонентами системы управления базами данных OpenEdge. Подробное описание этих компонентов представлено в учебном пособии «Основы администрирования СУБД OpenEdge». В целях актуализации знаний предлагаем провести краткий обзор ключевых аспектов данной архитектуры. Область хранения (Storage area) Область хранения представляет собой логически организованный набор физических файлов - [Что такое сайзинг базы данных](https://rupug.pro/lessons/advdba-1-2/) - Сайзинг базы данных представляет собой процедуру количественной оценки и анализа, направленную на определение оптимальных параметров для областей хранения прикладных данных, а также областей хранения Before-Image (BI) и After-Image (AI). Данная процедура проводится с целью верификации соответствия системы хранения, функционирующей в заданной конфигурации, требованиям клиента, включая критерии емкости и производительности на установленном оборудовании. При создании новой - [Введение](https://rupug.pro/lessons/advdba-1-1/) - Обеспечение достаточного объема дискового пространства для хранения прикладных данных является ключевой задачей администратора баз данных. Необходимо гарантировать, что базы данных располагают необходимым пространством не только для текущих ежедневных транзакций, но и для потенциального роста в будущем. В связи с этим важно уметь правильно оценивать и рассчитывать требуемый объем дискового пространства для баз данных. В рамках - [Задание 1: импорт примера приложения в Developer Studio](https://rupug.pro/lessons/rest-7/) - В этой части вы импортируете в Developer Studio пример приложения, CustomerOrderApp. Откройте Developer Studio. Для этого в меню “Пуск” выберите: Start > All Programs > Progress > OpenEdge > Developer Studio. Вам будет предложено выбрать рабочую область. Щёлкните мышью по кнопке Browse и укажите следующий путь к рабочей области C:\OpenEdge\WRK\REST\workspace и щёлкните по кнопке Select - [Прежде чем начать](https://rupug.pro/lessons/rest-01/) - Добро пожаловать на тренинг по разработке REST веб-приложений в OpenEdge! Прежде чем начать, есть несколько вещей, которые необходимо подготовить. Во время тренинга вы будете использовать файлы практических занятий, которые предоставляются вместе с этим пособием. Также вам будут необходимы некоторые лицензии на продукты OpenEdge. Для выполнения практических занятий необходимо использовать операционную систему Windows со всеми установленными - [Статические и динамические временные таблицы](https://rupug.pro/lessons/part-6-8/) - До настоящего времени вы работали с временными таблицами, которые определяются во включаемых файлах и называются статическими временными таблицами. В ABL также существует возможность работы с динамическими временными таблицами. Динамические временные таблицы создаются, когда необходимо сделать копию или подмножество статической временной таблицы или таблицы базы данных для последующей передачи в качестве параметра в другую часть приложения. - [Использование QUERY для перебора двух связанных временных таблиц](https://rupug.pro/lessons/part-6-7/) - Ранее вы освоили создание вложений для каждого блока, чтобы выполнить итерацию по связанным временным таблицам в наборе данных. Например, вы провели итерацию по временным таблицам ttCustomer, ttOrder и ttOrderLine. Теперь вы можете использовать QUERY для динамической итерации по записям более чем одной временной таблицы. Для этого нужно создать объект QUERY, который будет использовать несколько связанных - [Использование QUERY для перебора временной таблицы](https://rupug.pro/lessons/part-6-5/) - Вы уже знакомы с тем, как перебирать данные во временной таблице с помощью оператора for each. При использовании оператора for each необходимо указать имя временной таблицы и условия, которые будут использованы в запросе where. Запрос (query) позволяет динамически задавать имя временной таблицы и условия where во время выполнения, что расширяет возможности работы с приложением. Запрос - [Поиск записи во временной таблице](https://rupug.pro/lessons/part-6-4/) - Вы используете оператор find для поиска конкретной записи во временной таблице. Во время выполнения временная таблица имеет свойство, которое является текущей записью. Текущая запись устанавливается при выполнении оператора find. Если запись не найдена, текущая запись недоступна. Для игнорирования исключения, возникающего при отсутствии записи, используется ключевое слово no-error. Если вы используете структурированную обработку ошибок в ABL, - [Инициализация данных во временной таблице](https://rupug.pro/lessons/part-6-3/) - При создании новой записи во временной таблице можно задать начальные значения для каждой создаваемой записи. Как и в случае с другими типами данных, при определении полей временной таблицы можно задать начальные значения. Способ указания начального значения зависит от типа данных поля. Рассмотрим пример определения временной таблицы ttOrderLine. В данном примере мы указали начальное значение для - [Создание записи во временной таблице](https://rupug.pro/lessons/part-6-2/) - Ранее вы создавали код для чтения данных из набора данных и временной таблицы, а также для удаления записей из временной таблицы. В приложении OERA клиент обычно создаёт, изменяет и удаляет записи во временной таблице, связанной с бизнес-объектом. Когда обновление отправляется бизнес-объекту, серверная часть приложения обновляет данные в базе данных. Чтобы добавить запись (данные) во временную - [Введение](https://rupug.pro/lessons/part-6-1/) - На предыдущем занятии вы ознакомились с понятием наборов данных и временных таблиц, используемых для хранения бизнес-данных. Вы также узнали, что временные таблицы определяются в отдельном файле-включении, который может быть использован другими частями приложения. Кроме того, вы изучили основы работы с временными таблицами, включая итерацию по ним с помощью оператора «for each» и удаление текущей записи - [Итоги практического занятия](https://rupug.pro/lessons/task-5-6/) - В рамках этого занятия вы создали программный код на языке ABL, который работает с разными видами информации. В ходе работы над приложением вы будете использовать эти типы данных в бизнес-логике вашего проекта. Для дальнейшего изучения Для более эффективной работы с форматированием данных о времени и дате можно использовать функцию FormatTime(). Она использует функцию string() со - [Задание 5. Создание и использование пользовательской функции](https://rupug.pro/lessons/task-5-5/) - В третьем задании вы разработали код для поиска значения стиля операции CustNum в переменной ServiceDoc. В рамках данного задания вам предстоит использовать этот код для создания функции OperationStyle(), которая будет возвращать стиль в виде строки символов и принимать на вход символьную переменную ServiceDoc и параметр поиска для "wsdl:operation name". Создайте новую процедуру с именем WorkWithFunctions.p - [Задание 4. Работа с перечислениями (enums)](https://rupug.pro/lessons/task-5-4/) - Далее вы создадите определение перечисления и используете его в тестовой процедуре. Создайте файл определения перечисления (файл .cls) в папке WorkWithABLDataTypes. Назовите этот файл OrderDisposition.cls. Щёлкните правой кнопкой мыши по папке WorkWithABLDataTypes. Выберите «New» > «ABL class». Введите OrderDisposition в качестве имени класса. Когда файл класса откроется в редакторе, измените class на enum в двух местах. - [Задание 3. Работа с символьными данными](https://rupug.pro/lessons/task-5-3/) - В этом задании вы будете работать с переменной, определённой как символьный тип, чтобы извлечь из неё нужные данные с помощью встроенных строковых функций ABL. Импортируйте процедуру с именем WorkWithCharacterData.p в папку Server/src/Sandbox/WorkWithDataTypes. Эта процедура определяет одну переменную с именем ServiceDoc с начальным значением. Процедура находится в каталоге \Exercise\Lesson05. Переменная ServiceDoc — это XML- документ, который - [Задание 2. Работа с датами](https://rupug.pro/lessons/task-5-2/) - В этом задании вы напишете код для работы с датой и временем. В папке WorkWithABLDataTypes создайте новую процедуру ABL под названием WorkWithDateTime.p. Скопируйте весь код до первого оператора «for each» из предыдущей процедуры AccumulateCustomerOrderTotal.p. Замените имя файла журнала, чтобы он назывался WorkWithDateTime.out. Теперь ваш код должен выглядеть следующим образом: {include/dsCustomerBE.i} DEFINE VARIABLE hdsCustomerBE AS HANDLE - [Задание 1. Аккумуляция десятичных значений](https://rupug.pro/lessons/task-5-1/) - В рамках этого занятия вы попрактикуетесь в использовании различных типов данных, о которых вы узнали в ходе данного урока. Вы модифицируете приложение, которое вы уже создали, для поддержки большего количества типов данных. Также вы создадите пользовательскую функцию. Занятие состоит из пяти частей. На его выполнение потребуется примерно 60-90 минут. Вы будете выполнять эти задания в - [Задание 1. Создание проекта ABLUnit](https://rupug.pro/lessons/task-1-creating-an-ablunit-project/) - На этом практическом занятии вы будете использовать среду тестирования ABLUnit для тестирования класса бизнес-сущности, который вы разработали в этом уроке. Вы создадите проект ABLUnit в Developer Studio и создадите тестовый класс, который тестирует класс CustomerBE. Затем выполните тест. Это упражнение состоит из 4 частей. Выполнение этапов упражнения занимает около 30 минут. Вы попрактикуетесь в этой - [Разработка пользовательской функции](https://rupug.pro/lessons/part-5-8/) - Вы уже ознакомились с рядом встроенных функций ABL и, возможно, даже использовали некоторые из них. Если же вам необходима функциональность, которая не предусмотрена существующими встроенными функциями, вы можете создать свою собственную функцию. Функция — это блок специализированного кода, аналогичный процедуре или методу, который должен возвращать значение. Вы можете определять функции только в файле процедур. Функция - [Использование перечислений в приложении](https://rupug.pro/lessons/part-5-7/) - Ранее вы узнали, что можно определить пользовательский тип для представления класса, например бизнес-объекта. Имя типа – это имя класса. Другим полезным пользовательским типом данных является перечисление. Перечисление или enum позволяет определить набор значений (называемых элементами enum), которые допустимы для определенного пользователем типа данных. Вы можете определить переменную, свойство или входной параметр, который относится к определяемому - [Работа с логическими выражениями и данными](https://rupug.pro/lessons/part-5-6/) - Логические данные и выражения представляют собой двоичное значение — "yes" или "no". Логические значения и выражения используются во многих частях приложения. Многие функции, методы и процедуры возвращают значения, которые сообщают об успешном или неудачном выполнении. В своём коде вы обычно будете проверять возвращаемое значение для принятия решения и продолжения выполнения. Вы уже знаете, как вычислять - [Использование символьных данных](https://rupug.pro/lessons/part-5-5/) - Приложение ABL может определять символьные данные двумя способами. Вы уже определили переменные типа character. Символьная переменная может содержать значения в виде символьных строк размером до 30 КБ. Если вам нужно сохранить строку символов размером более 30 КБ, используйте тип данных longchar. Вы не можете определить поля longchar во временной таблице или таблице базы данных. В - [Использование даты и времени](https://rupug.pro/lessons/part-5-4/) - Большинству приложений требуются данные о дате и времени. В вашем приложении можно определить три типа данных, связанных с датой и временем: Примитивный тип ABL Описание date Значение, представляющее дату. Дата отображается по григорианскому календарю. datetime Значение, состоящее из двух частей: оно представляет дату и время в миллисекундах, начиная с полуночи этой даты. datetime-tz Значение, состоящее - [Использование числовых данных](https://rupug.pro/lessons/part-5-3/) - Язык ABL имеет три числовых типа данных, которые вы можете использовать в своем приложении. Примитивный тип ABL Описание integer Значение, представляющее собой 32-разрядное целое число с максимальным значением со знаком +/-2 147 483 647 и максимальным значением без знака 4 294 967 295. int64 Значение, представляющее собой 64-разрядное целое число с максимальным значением со знаком +/-9 223 372 036 854 775 807. decimal Значение, содержащее максимум 50 - [Использование функции string() для форматирования](https://rupug.pro/lessons/part-5-2/) - На предыдущих уроках вы узнали, как записывать данные в файл или в пользовательский интерфейс. Это полезно при разработке приложения, чтобы помочь вам определить, использует ли приложение данные так, как вы ожидали. Ранее вы использовали инструкции message для записи данных в выходной файл. Для этих данных применялось форматирование по умолчанию. Лучшей практикой при записи данных с - [Введение](https://rupug.pro/lessons/part-5-1/) - На предыдущих уроках вы узнали, как определять символьные и числовые данные в процедурах и классах. Кроме того, вы узнали, как определять временные таблицы и наборы данных и включать их в свои классы и процедуры. Вы также узнали, как определять и использовать определяемый пользователем тип (класс). На этом уроке вы узнаете больше о работе с типами - [Поддерживаемые методы HTTP в ABL](https://rupug.pro/lessons/rest-33/) - В REST для работы с ресурсом используются HTTP-методы. В следующей таблице приведён список методов HTTP которые можно использовать клиентом OpenEdge ABL: Метод HTTP Назначение POST Создаёт новую запись. GET Возвращает запись на основе предоставленного идентификатора. PUT Обновляет существующую запись. DELETE Удаляет существующую запись. HEAD Возвращает только информацию заголовка HTTP. Он похож на метод GET, за - [От автора](https://rupug.pro/lessons/from-the-author-2/) - Здравствуйте! Меня зовут Валерий Григорьевич Башкатов, и я хотел бы выразить вам признательность за участие в одном из наших обучающих мероприятий. Надеюсь, полученные знания оказались для вас ценными. Если вам понравился тренинг, я хотел бы попросить вас рассмотреть возможность поддержки нашего проекта. Вот несколько способов, как вы можете помочь: Поделитесь информацией о тренинге в социальных - [OpenEdge Replication](https://rupug.pro/lessons/openedge-replication/) - OpenEdge Replication представляет собой технологию, которая обеспечивает непрерывное копирование данных из исходной базы данных (Source) в целевую базу данных (Target) с использованием технологии After-Imaging. В случае сбоя в работе исходной базы данных (Source), целевая база данных (Target) может быть автоматически переведена в оперативный режим для обеспечения доступа к данным. Это позволяет избежать ситуации, когда база - [Задание 8.1: настройка Message Buffer Size](https://rupug.pro/lessons/tune-tryit-18-1/) - В рамках данного задания необходимо выполнить настройку параметра Message Buffer Size в режиме оффлайн. Для начала необходимо измерить время отклика поискового запроса и количество сетевых сообщений, чтобы определить базовые показатели производительности. Затем необходимо остановить базу данных ATM и изменить значение параметра Message Buffer Size в файле параметров atm.pf. Для упрощения процесса запуска базы данных необходимо - [Настройка параметра Prefetch Priority](https://rupug.pro/lessons/tune-47-2-3/) - В главе «Настройка параметров базы данных» было рассмотрено, что с помощью параметра Prefetch Priority (–prefetchPriority) можно указать серверу количество записей упреждающей выборки, которые он должен добавить в сообщение перед выполнением проверки наличия запросов от других пользователей. Это предоставляет преимущество текущему запросу упреждающей выборки перед обработкой новых запросов от других удалённых подключений. Если вы столкнулись с - [Настройка параметра Prefetch NumRecs](https://rupug.pro/lessons/tune-47-2-2/) - В целях оптимизации сетевого взаимодействия рекомендуется активировать параметр Prefetch Delay (-prefetchDelay) в файле параметров. Этот параметр позволяет серверу заполнять сетевое сообщение большим количеством записей перед отправкой клиенту. Это уменьшает количество отправляемых сообщений и улучшает производительность. Один из двух параметров упреждающей выборки, которые можно установить совместно с Prefetch Delay, — это параметр Prefetch NumRecs (-prefetchNumRecs). Второй - [Задание 6.3: настройка областей хранения](https://rupug.pro/lessons/tune-tryit-16-3/) - В рамках данного этапа занятия будет проведена проверка состояния областей хранения с использованием утилиты PROSTRCT STATISTICS. После этого планируется добавление новых экстентов в области хранения, заполненные более чем на 80%. Сформируйте отчёт по состоянию областей хранения базы данных ATM утилитой PROSTRCT STATISTICS в файл atm_areas.txt: prostrct statistics atm > atm_areas.txt Откройте файл atm_areas.txt и рассчитайте - [Задание 6.1: тюнинг буферов базы данных](https://rupug.pro/lessons/tune-tryit-16-1/) - В рамках данного этапа занятия необходимо провести мониторинг процентного соотношения попаданий в буфер (Buffer Hits) для первичного и альтернативного буферных пулов, а также произвести их соответствующую настройку. Для определения степени влияния изменений необходимо запустить скрипт go.bat до и после внесения изменений в параметры. Дополнительно необходимо настроить параметры LRU force skips и LRU2 force skips и - [Задание 5.2: настройка BI-блолка, BI-кластера и количества BI-кластеров](https://rupug.pro/lessons/tune-tryit-15-3/) - В этом задании вам необходимо выполнить мониторинг и настройку размера BI-блока, размера BI-кластера и количества предварительно отформатированных BI-кластеров в базе данных ATM. Запустите скрипт go.bat и дождитесь завершения работы ATM-теста: go.bat В PROMON откройте экран BI Log чтобы посмотреть общее количество BI-записей. Откройте PROMON с подключением к базе данных ATM. В поле Enter your selection - [Задание 5.1: настройка буферов BI](https://rupug.pro/lessons/tune-tryit-15-2/) - В этом задании необходимо выполнить тюнинг BI-буферов в работающей базе данных ATM. Вам необходимо стартовать скрипт go.bat до и после настройки чтобы увидеть влияние сделанных изменений на ввод-вывод BI. Выполните старт Proenv и перейдите в каталоге базы данных ATM: cd C:\OpenEdge\WRK\dbtune\atm\db Запустите скрипт go.bat. Дождитесь завершения работы ATM-теста. С помощью PROMON определите значение метрики Empty - [Задание 4.2: тюнинг Spin Lock Retries](https://rupug.pro/lessons/tune-tryit-10/) - В этом задании необходимо выполнить мониторинг параметра старта базы данных Spin Lock Retries (-spin), определить степень его влияния на производительность базы данных ATM и изменить его значение. Мониторинг Latch timeouts в базе данных ATM с помощью PROMON. Запустите PROMON с подключением к базе данных ATM: promon atm В поле Enter your selection введите R&D и - [Задание 4.1: определение базовых показателей производительности](https://rupug.pro/lessons/tune-tryit-9/) - В этой части занятия необходимо определить базовые показатели производительности для работающей базы данных ATM выполнив скрипт go.bat, где наиболее важным результатом каждого прогона будет количество транзакций в секунду (tps). Откройте Proenv и перейдите в каталог atm\db\: cd C:\OpenEdge\WRK\dbtune\atm\db\ Выполните скрипт go.bat: proenv>go.bat atm database is up. Starting test driver driver.p, but first Results will be - [Задание 3.2: старт базы данных ATM с файлом параметров](https://rupug.pro/lessons/tune-tryit-7/) - Выполните старт базы данных ATM с использованием созданного ранее файла параметров, при этом предварительно активировав механизм After-Imaging и автоматическое управления AI-файлами. Выполните старт дополнительных фоновых процессов. Откройте Proenv и перейдите в каталог C:\OpenEdge\WRK\dbtune\atm\db: cd C:\OpenEdge\WRK\dbtune\atm\db\ Сформируйте полную резервную копию базы данных ATM в файл C:\OpenEdge\WRK\dbtune\atm\backups\atm3.bkp и проверьте её: probkup atm ..\backups\atm3.bkp prorest atm ..\backups\atm3.bkp -vf - [Задание 3.1: создание файла параметров](https://rupug.pro/lessons/tune-tryit-6/) - Создайте файл параметров, содержащий параметры для улучшения работы с разделяемой памятью, BI, буферным пулом, AI и сетевой коммуникацией базы данных ATM. Откройте текстовый редактор. Введите следующие параметры старта баз данных для брокера, серверов и пользователей базы данных ATM: Database (-db): atm Host (-H): localhost Port (-S): 20001 Maximum number of users (-n): 101 Number of - [Параметры старта буферного пула](https://rupug.pro/lessons/tune-19/) - Буферный пул базы данных – это область в разделяемой памяти, которая содержит буферы базы данных. Буферы базы данных предназначены для хранения копий блоков базы данных, содержащих записи из таблиц или индексы. Буферы базы данных служат рабочей областью для CRUD (Create, Read, Update, Delete) -операций. Буферы базы данных являются крупнейшим потребителем ресурсов разделяемой памяти. Чем больше - [Параметры старта Before-Imaging](https://rupug.pro/lessons/tune-18/) - В СУБД OpenEdge всегда включён механизм Before-Imaging в работающей базе данных, что гарантирует её восстановление в случае системных сбоев. Ранее вы узнали, как рассчитать количество и размеры BI-экстентов для достижения хорошей производительности. В дополнение к этому администратор может использовать параметры старта базы данных для улучшения производительности путём минимизации операций ввода-вывода BI. Операции ввода-вывода BI, как - [Параметры старта разделяемой памяти](https://rupug.pro/lessons/tune-17/) - В предыдущей главе мы подробно рассмотрели процесс проектирования базы данных на физическом уровне с целью обеспечения максимальной производительности. В этой же главе мы сосредоточимся на вопросах настройки параметров старта базы данных, что также имеет ключевое значение для обеспечения оптимальной производительности. После того как база данных спроектирована и введена в эксплуатацию, администратор базы данных получает возможность - [Задание 2.3: загрузка описания данных и содержимого таблиц](https://rupug.pro/lessons/tune-tryit-5/) - В заключительной части практического занятия внесите изменения в описание данных в файле atm.df для распределения таблиц и индексов по ассоциированным с ними областям хранения. Затем выполните загрузку описания данных и содержимого таблиц в базу данных ATM. Используя любой текстовый редактор откройте файл atm.df из каталога C:\OpenEdge\WRK\dbtune\atm\data. Замените названия областей хранения для таблиц и индексов, согласно - [Задание 2.1: Создание структурного файла](https://rupug.pro/lessons/tune-tryit-3/) - На предыдущем занятии вы создали исходную базу данных ATM «из коробки» и выгрузили описание данных и содержимое её таблиц во внешние файлы, а также сгенерировали файл с анализом состояния объектов базы данных. На этом занятии необходимо спроектировать ATM базу данных с новой структурой для достижения хорошей производительности. Сначала вы создадите структурный файл используя информацию из - [Задание 1.3: дополнительные действия с базой данных ATM](https://rupug.pro/lessons/tune-tryit-2/) - В этом упражнении мы проанализируем базу данных штатным средством dbanalys и сделаем полную резервную копию базы. В конце упражнения БД atm будет остановлена и удалена. В Proenv выполните команду создания анализа состояния базы данных (dbanalys) с сохранением результата в файл C:\OpenEdge\WRK\dbtune\atm\logs\atm_dbanalys.txt: proutil atm -C dbanalys > .\logs\atm_dbanalys.txt Сформируйте полную резервную копию работающей базы данных ATM - [Задание 1.2: выгрузка описания и данных из базы ATM](https://rupug.pro/lessons/tune-tryit-1/) - Выполните выгрузку описания данных и содержимого таблиц из работающей базы данных ATM. В Proenv выполните старт Data Administration c подключением к базе данных ATM в многопользовательском режиме: prowin atm -p _admin Выполните выгрузку описания всех данных: Выберите пункт меню: Admin -> Dump Data and Definitions -> Data Definitions (.df file). Откроется диалоговое окно Select Tables. - [Описание занятия](https://rupug.pro/lessons/tune-tryit-0/) - В ходе практического занятия вам будет предложено создать базу данных с использованием стандартных параметров. Затем необходимо будет выполнить выгрузку описания данных (словаря данных и данных таблиц) и самих данных из созданной базы данных во внешние файлы. Также вам предстоит решить ряд дополнительных задач. Обратите внимание, что база данных, созданная на данном занятии, будет использоваться нами - [Задание 1.1: создание исходной базы данных ATM](https://rupug.pro/lessons/tune-tryit/) - Для создания исходной базы данных ATM выполним следующие действия: Откроем командную строку Proenv, выбрав пункт меню Start -> All Programs -> Progress -> OpenEdge -> Proenv. Перейдём в каталог C:\OpenEdge\WRK\dbtune\atm: cd C:\OpenEdge\WRK\dbtune\atm Создадим исходную базу данных, выполнив скрипт build.bat. proenv>build.bat Build 10 tps atm database using 4 processes Press CTRL-C to cancel. - [Приложение-пример](https://rupug.pro/lessons/tune-5/) - На практических занятиях мы будем работать с набором для проведения тестов – ATM (Automatic Teller Machine). Приложение ATM содержит следующие ключевые файлы: Скрипт build.bat – предназначен для создания базы данных ATM. Процедура на языке ABL atm.p – предназначена для генерации клиентской активности имитируя открытие депозитов и снятие денежных средств от имени ATM-клиента. Скрипт go.bat – - [Задачи упреждающей настройки](https://rupug.pro/lessons/tune-3/) - Применение упреждающего подхода к настройке производительности позволяет обеспечить оптимальную работу базы данных. Упреждающий подход подразумевает выполнение следующих задач: Анализ рабочей нагрузки. Определение базовых показателей производительности. Мониторинг базы данных. Настройка базы данных. Упреждающая настройка представляет собой итеративный процесс, поскольку со временем рабочая нагрузка, базовые показатели производительности и методы использования базы данных могут претерпевать изменения. Это, в - [Подходы к настройке производительности](https://rupug.pro/lessons/tune-2/) - Производственная база данных представляет собой динамическую систему, которая постоянно эволюционирует. В неё добавляются новые записи, существующие записи запрашиваются, обновляются и удаляются, таблицы, индексы и последовательности модифицируются или удаляются. Цель настройки производительности базы данных — обеспечить максимальную эффективность всех этих процессов. Существует два основных подхода к настройке производительности: реактивный и упреждающий. Реактивный подход предполагает диагностику проблем - [Введение](https://rupug.pro/lessons/tune-1/) - В настоящее время системы управления базами данных (СУБД) Progress OpenEdge предоставляют возможность создания и поддержки многоуровневых приложений, предназначенных для обслуживания разнообразных категорий клиентов, включая пользователей операционных систем Windows, интернета и мобильных устройств. Эти клиенты должны обладать надёжностью, безопасностью, масштабируемостью и удобством доступа. Однако с течением времени объём данных в базах данных имеет тенденцию к увеличению, - [Подведение итогов](https://rupug.pro/lessons/tune-conclusion/) - В рамках данного тренинга мы рассмотрели фундаментальные основы и подходы к оптимизации производительности базы данных, а также ознакомились с инструментами мониторинга и настройки PROMON, OpenEdge Management и виртуальными системными таблицами. В ходе обучения мы детально изучили физическую структуру базы данных на уровне файловой системы, включая области хранения, экстенты, кластеры и блоки. Также мы рассмотрели ключевые - [OpenEdge Table Partitioning](https://rupug.pro/lessons/openedge-table-partitioning/) - OpenEdge Table Partitioning позволяет разделить записи очень больших таблиц на небольшие части, называемые секциями, и управлять каждой секцией отдельно. Логически для приложения таблица по-прежнему будет представляться как единое целое. Физически она хранится в нескольких секциях базы данных. В одной таблице можно создать до 32 765 секций. Поскольку OpenEdge Table Partitioning встроен на уровень базы данных, - [OpenEdge Multi-tenancy](https://rupug.pro/lessons/openedge-multi-tenancy/) - OpenEdge Multi-tenancy предоставляет возможность создания многопользовательских баз данных, в которых различные группы пользователей, известные как арендаторы (tenants), разделяют общую схему базы данных, но имеют доступ и работают только со своими индивидуальными данными. Эти данные хранятся в независимых областях базы данных. Во время работы все арендаторы могут получать надёжный и безопасный доступ как к общим данным, - [OpenEdge Transparent Data Encryption](https://rupug.pro/lessons/openedge-transparent-data-encryption/) - OpenEdge Transparent Data Encryption (TDE) обеспечивает защиту конфиденциальных прикладных данных, находящихся в состоянии покоя, таких как данные, хранящиеся на диске в файлах прикладных данных, в системах BI и AI, а также в резервных копиях базы данных. В случае получения злоумышленником копии любого из файлов базы данных, конфиденциальные данные останутся защищенными, так как они зашифрованы. СУБД - [Введение](https://rupug.pro/lessons/tune-48/) - СУБД OpenEdge предоставляет ряд расширенных функций, которые обеспечивают высокую доступность, безопасность, мультиарендность и секционирование базы данных. Каждая из этих функций имеет свои рекомендации по управлению производительностью. Администратор базы данных должен понимать эти рекомендации, чтобы своевременно принимать необходимые меры для обеспечения оптимальной производительности базы данных. В данной главе рассматриваются расширенные возможности базы данных и основные рекомендации - [Задание 8.3: настройка Prefetch Priority](https://rupug.pro/lessons/tune-tryit-18-3/) - В рамках данного задания необходимо выполнить следующие действия: Перезапустить базу данных ATM. В режиме онлайн изменить параметр Prefetch Priority. Измерить время отклика и количество сетевых сообщений. Сравнить полученные результаты с данными, полученными во втором задании. В первой сессии Proenv остановите базу данных ATM: proshut atm -by Откройте для редактирования файл параметров atm.pf и добавьте новый - [Задание 8.2: настройка Prefetch NumRecs](https://rupug.pro/lessons/tune-tryit-18-2/) - В рамках данного задания необходимо выполнить следующие действия: Перезапустить базу данных ATM. В онлайн-режиме изменить параметр Prefetch NumRecs (-prefetchNumRecs). Измерить время отклика и количество сетевых сообщений. Сравнить полученные результаты с данными, полученными в предыдущем задании. В первой сессии Proenv остановите базу данных ATM: proshut atm -by Выполните старт базы данных ATM: proserve -pf atm.pf В - [Мониторинг сетевого взаимодействия](https://rupug.pro/lessons/tune-47-1/) - Прежде чем приступить к мониторингу сетевого взаимодействия на постоянной основе, необходимо установить базовый уровень производительности для работы сети. В частности, необходимо определить следующие параметры: время отклика операций поиска данных; количество сетевых сообщений, отправленных и полученных в ответ на запрос поиска данных. В процессе мониторинга производительности сетевого взаимодействия может быть замечено ухудшение времени отклика операций поиска - [Описание занятия](https://rupug.pro/lessons/tune-tryit-18/) - На данном занятии вы попрактикуетесь в мониторинге и оптимизации производительности сетевого взаимодействия. В ходе занятия вы будете выполнять следующие задачи: Мониторинг сетевого взаимодействия для определения базовых показателей. Наблюдение за влиянием ваших изменений на производительность. Обратите внимание, что при выполнении запроса извлечения данных из базы данных СУБД OpenEdge помещает данные в буферный пул в памяти, а - [Настройка параметра Message Buffer Size](https://rupug.pro/lessons/tune-47-2-1/) - В главе «Настройка параметров базы данных» было рассмотрено использование буферов сообщений в СУБД OpenEdge для передачи записей между серверами и удалёнными клиентами. Для установки размера буфера сообщений в байтах используется параметр Message Buffer Size (-Mm). По умолчанию размер буфера сообщений составляет 1024 байта. Рекомендуется установить стартовое значение равным 8192 байта. Кроме того, если было выявлено - [Настройка сетевого взаимодействия](https://rupug.pro/lessons/tune-47-2/) - В процессе мониторинга сетевого взаимодействия может быть обнаружено ухудшение времени отклика операций поиска данных или значительное увеличение количества отправленных и полученных сетевых сообщений, что негативно сказывается на производительности. В такой ситуации необходимо рассмотреть возможность настройки параметров сетевого взаимодействия. Далее будет описано, как выполнить настройку следующих параметров: Message Buffer Size. Prefetch NumRecs. Prefetch Priority. - [Введение](https://rupug.pro/lessons/tune-47/) - В многоуровневых приложениях сетевые сообщения непрерывно передаются между удалёнными клиентами и сервером базы данных. Такое сетевое взаимодействие может стать причиной узких мест, которые негативно сказываются на производительности системы. В главе «Настройка параметров базы данных» вы узнали о том, как настроить параметры запуска базы данных, отвечающие за сетевое взаимодействие. В процессе работы с базой данных администратор - [Задание 7.3: старт базы данных ATM](https://rupug.pro/lessons/tune-tryit-17-3/) - В рамках данного задания после внесения изменений в файл «atm.pf» необходимо запустить базу данных ATM с новыми параметрами. Откройте для редактирования файл atm.pf и добавьте в него параметр -aibufs и -bibufs со значением 60, как это было сделано в первом заданий в онлайн: -bibufs 60 -aibufs 60 Сформируйте полную резервную копию базы данных ATM, сохранив - [Задание 7.2: изменение размера AI-блока](https://rupug.pro/lessons/tune-tryit-17-2/) - В рамках данного задания необходимо выполнить следующие действия: Провести мониторинг объёма AI-записи (Total AI Writes) в работающей базе данных ATM. Изменить размер AI-блока на остановленной базе данных. Выполните старт скрипта go.bat и дождитесь завершения его работы. Мониторинг объёма AI-записи Выполните старт PROMON с подключением к базе данных ATM. В поле Enter your selection введите R&D - [Задание 7.1: настройка AI-буферов](https://rupug.pro/lessons/tune-tryit-17-1/) - В рамках данного задания необходимо осуществить мониторинг и настройку AI-буферов базы данных ATM в онлайн-режиме. Перед внесением каждого изменения и после его применения необходимо запустить скрипт go.bat для определения степени влияния внесённых изменений на ввод-вывод данных базы данных. Откройте Proenv и перейдите в каталог базы данных ATM. Выполните старт скрипта go.bat и дождитесь завершения его - [Описание занятия](https://rupug.pro/lessons/tune-tryit-17/) - В рамках данного занятия необходимо провести мониторинг и настройку AI-буферов, а также определить размер AI-блока базы данных ATM. В процессе выполнения задания вы будете продолжать использовать скрипт go.bat для генерации и измерения количества транзакций в секунду, после чего будет проведено сравнение полученных результатов с базовыми показателями производительности. - [Настройка размера блока AI](https://rupug.pro/lessons/tune-46-3/) - В СУБД OpenEdge, как и в механизме Before-Imaging, AI-заметки записываются в блоки файла After-Image. Для минимизации ввода-вывода AI можно увеличить размер AI-блока, что позволит СУБД записывать больше AI-данных на диск за один раз. По умолчанию размер AI-блока составляет 8 Кб, что достаточно для приложений с низкой транзакционной активностью. Однако необходимо отслеживать значения общего объёма AI-записи - [Настройка AI-буферов](https://rupug.pro/lessons/tune-46-2/) - В первую очередь, система управления базами данных (СУБД) OpenEdge записывает AI-заметки в буферы After-Imaging, которые находятся в памяти. Как только AI-буферы заполняются, СУБД выполняет запись их содержимого на диск. Чем больше доступно пустых AI-буферов, тем больше AI-заметок СУБД будет записывать в AI-буферы, и тем реже будет требоваться записывать AI-данные на диск, что приводит к повышению - [Физические компоненты хранения AI](https://rupug.pro/lessons/tune-46-1/) - Система хранения After-Imaging аналогична системе хранения Before-Imaging, но имеет более простую реализацию. Компоненты хранения After-Imaging включают в себя: Область хранения After-Imaging (AI) — каждая область хранения After-Imaging состоит из одного экстента After-Image представленного в виде файла. Каждый AI-файл содержит множество AI-блоков. AI-блоки — каждый AI-блок содержит AI-заметки о транзакциях в базе данных. Блок After-Imaging соответствует - [Введение](https://rupug.pro/lessons/tune-46/) - Ввод-вывод данных, генерируемый механизмом After-Imaging, является вторым наиболее распространённым источником узких мест в производительности системы после Before-Imaging. Это связано с тем, что система управления базами данных OpenEdge всегда записывает изменённые данные в первую очередь в файлы BI, затем в файлы AI, и только после этого в файлы прикладных данных. Поэтому важно, чтобы администратор понимал, как - [Задание 6.2: настройка процессов APW](https://rupug.pro/lessons/tune-tryit-16-2/) - В рамках данного этапа занятия необходимо провести мониторинг сброса на диск буферов в момент контрольной точки, а также настроить количество процессов APW. Выполните скрипт go.bat и дождитесь завершения его работы. Мониторинг сброса буферов в контрольной точке в базе данных ATM с помощью PROMON: В поле Enter your selection введите R&D (Advanced options) и нажмите клавишу - [Описание занятия](https://rupug.pro/lessons/tune-tryit-16/) - В рамках данного занятия необходимо выполнить мониторинг и настройку различных аспектов ввода-вывода базы данных в базе данных ATM. Первым этапом будет настройка буферов базы данных в онлайн-режиме для первичного и вторичного буферных пулов. Затем необходимо настроить процессы APW. В завершение следует проверить размеры областей хранения и при необходимости добавить новые экстенты в наиболее используемые из - [Тюнинг областей хранения](https://rupug.pro/lessons/tune-45-7/) - В системах, поддерживающих обработку транзакций в режиме реального времени (OLTP), объём данных, генерируемых ежедневно, может быстро заполнять дисковое пространство. В связи с этим администратору необходимо осуществлять проактивный мониторинг областей хранения работающей базы данных и своевременно предпринимать соответствующие действия для выделения дополнительного пространства для новых данных. В рамках задачи по проектированию базы данных для достижения оптимальной - [Тюнинг процессов APW](https://rupug.pro/lessons/tune-45-6/) - Процессы APW (Asynchronous Page Writer) представляют собой опциональные фоновые процессы, которые непрерывно записывают незаблокированные изменённые буферы базы данных на диск. Процессы APW улучшают производительность по ряду причин: обеспечивают стабильное снабжение СУБД OpenEdge пустыми буферами базы данных; уменьшают количество буферов базы данных, которые СУБД необходимо проверить перед записью разблокированных изменённых буферов на диск; сокращают накладные расходы, - [Использование частных буферов только для чтения.](https://rupug.pro/lessons/tune-45-5/) - В случае, если в базе данных процент Buffer Hits для первичного и альтернативного буферов составляет более 95% в течение большей части времени, но при этом существуют конечные пользователи, которые в конце месяца или квартала генерируют большие и длительные отчеты, то для таких пользователей можно использовать частные буферы только для чтения (private read-only buffers). В многопользовательской - [Настройка LRU skips](https://rupug.pro/lessons/tune-45-4-4/) - Цепочка Least Recently Used (LRU) представляет собой структуру разделяемой памяти, используемую СУБД OpenEdge для отслеживания буферов базы данных, которые не использовались в течение длительного времени, и реализации политики вытеснения LRU-буферов. Каждый раз, когда клиентский процесс обращается к буферу базы данных, сервер перемещает его в конец цепочки LRU. Во время этого перемещения другие процессы не могут - [Увеличение размера буферного пула онлайн](https://rupug.pro/lessons/tune-45-4-3/) - В случае если в базе данных процент Buffer Hints для первичного и/или альтернативного буферного пула составляет менее 95%, необходимо увеличить количество буферов в соответствующем буферном пуле для минимизации ввода-вывода и повышения производительности. Для увеличения количества буферов в буферном пуле онлайн используется утилита PROUTIL INCREASETO. Утилита может применяться как для альтернативного, так и для первичного буферного - [Мониторинг Buffer Hits с помощью VST](https://rupug.pro/lessons/tune-45-4-2/) - Мониторинг Buffer Hits можно выполнять, используя виртуальную системную таблицу _ActBuffer. Таблица содержит три записи: Общее значение Buffer Hits для первичного и альтернативного буферных пулов. Значение Buffer Hits для первичного буферного пула. Значение Buffer Hits для альтернативного буферного пула. Каждая запись таблицы _ActBuffer содержит три ключевых поля: _Buffer-LogicRds (INT64) – количество клиентских запросов к блокам базы - [Мониторинг Buffer Hits в OpenEdge Management](https://rupug.pro/lessons/tune-45-4/) - Для мониторинга Buffer Hits с помощью OpenEdge Management необходимо выполнить следующие действия: В секции Operation Views работающей базы данных щёлкнуть мышью по ссылке Memory Resources. На странице Memory Resources в секции Buffers summary посмотреть значение в поле Used Buffers %, это эквивалент Buffer Hits в PROMON. Если значение Used Buffers % меньше 95%, то необходимо - [Мониторинг Buffer Hits в PROMON](https://rupug.pro/lessons/tune-45-3/) - Администратор должен осуществлять проактивный мониторинг процентного соотношения Buffer Hits в первичном и альтернативном буферных пулах. Проактивный мониторинг представляет собой процесс наблюдения за событиями с целью выявления закономерностей и корреляций, что позволяет прогнозировать возможные проблемы. Постоянный сбор информации о событиях в наблюдаемых системах и сервисах, а также контроль ключевых параметров позволяют получить полное представление о текущем - [Тюнинг буферов базы данных](https://rupug.pro/lessons/tune-45-2/) - Буферы базы данных используются для хранения данных приложения, которые считываются и записываются на диск. Чем больше буферов доступно, тем меньше операций ввода-вывода необходимо базе данных, и тем лучше производительность. Наличие достаточного количества буферов базы данных улучшает производительность по следующим причинам: Сводит к минимуму необходимость СУБД в чтении записей с диска, поскольку запрашиваемые данные могут уже - [Введение](https://rupug.pro/lessons/tune-45/) - Прикладные данные являются наиболее важным компонентом работающей базы данных и ввод-вывод базы данных, как результат чтения и записи этих данных, может быть существенной причиной возникновения узких мест в производительности. В общем, чем реже происходят операции ввода-вывода, тем выше производительность базы данных. Поэтому для повышения производительности важно уметь выполнять мониторинг и настраивать ввод-вывод базы данных. Из - [Задание 5.3: рестарт базы данных ATM с новыми параметрами](https://rupug.pro/lessons/tune-tryit-15-4/) - В этом задании необходимо изменить параметры старта базы данных в файле параметров atm.pf и выполнить рестарт базы данных ATM. Откройте и отредактируйте файл параметров atm.pf и установите новые значения для следующих параметров: -spin 25000 -bibufs 60 Создайте резервную копию базы данных ATM: probkup atm ..\backups\atm4.bkp Выполните старт базы данных ATM с использованием файла параметров - [Описание занятия](https://rupug.pro/lessons/tune-tryit-15/) - На этом занятии необходимо выполнить мониторинг и настройку различных областей механизма Before-Imaging для базы данных ATM. Сначала в онлайн выполните мониторинг и настройку количества BI-буферов. Затем, настройте размера блока и кластера BI, а также определите оптимальное количество предварительно отформатированных BI-кластеров. В заключение выполните перезапуск базы данных ATM с новыми параметрами. Во время выполнения задач по - [Тюнинг записи в BI-файл](https://rupug.pro/lessons/tune-44/) - Каждый раз, когда транзакция завершается, СУБД OpenEdge должна немедленно в синхронном режиме с использованием надёжного небуферизованного ввода-вывода записать commit-заметку для этой транзакции в BI-файл. Это гарантирует, что транзакция будет сохранена в базе данных и может быть восстановлена в случае сбоя. Однако такая реализация BI-записи имеет следующие последствия: В незагруженной системе с незначительной активностью по части - [Тюнинг отформатированных кластеров BI](https://rupug.pro/lessons/tune-43/) - При первоначальном старте базы данных, а также при первом старте после усечения BI-файла, СУБД по умолчанию выполняет форматирование цепочки из четырёх BI-кластеров. Со временем, в результате манипуляций с данными, количество BI-кластеров становится больше стандартных четырёх. Когда BI-кластер достигает контрольной точки, СУБД пытается переключить запись BI-заметок об изменённых данных на следующий доступный в цепочке кластер, при - [Тюнинг кластера BI](https://rupug.pro/lessons/tune-42/) - Во время старта базы данных СУБД OpenEdge по умолчанию создаёт и форматирует в BI-файле цепочку из четырёх кластеров по 512 Кб. Каждый BI-кластер содержит последовательность из BI-блоков. Когда СУБД записывает BI-заметки в BI-файл запись происходит в BI-блоки текущего заполняемого BI-кластера. Когда все BI-блоки кластера будут заполнены, произойдёт так называемая «контрольная точка» (checkpoint), в этот момент - [Тюнинг размера блока BI](https://rupug.pro/lessons/tune-41/) - СУБД OpenEdge записывает BI-заметки в BI-файл по блокам. Поэтому минимизировать ввод-вывод BI можно увеличив размер BI-блока, тем самым позволяя СУБД записывать больше данных на диск за один раз. По умолчанию размер блока BI равен 8 Кб. Этого достаточно для приложений с небольшой транзакционной активностью. Однако администратор должен выполнять мониторинг BI-запись (Total BI writes) при активном - [Тюнинг буферов BI](https://rupug.pro/lessons/tune-40/) - СУБД OpenEdge пишет BI-заметки, которые описывают транзакции в базе данных, в BI-буферы в памяти. После заполнения BI-буферов СУБД записывает их содержимое на диск. Чем больше будет пустых BI-буферов, тем больше пространства будет доступно СУБД для записи BI-заметок в BI-буферы и тем реже СУБД требуется записывать BI-данные на диск. В результате это приводит к улучшению производительности. - [Физические компоненты хранения BI](https://rupug.pro/lessons/tune-39/) - Физическая база данных OpenEdge состоит из областей хранения, экстентов, кластеров и блоков базы данных. Физическая структура хранения Before-Imageаналогичная и состоит из следующих компонент: Область хранения BI – состоит из одного или более BI-экстентов. Экстенты BI – каждый BI-экстенты является физическим файлом, который содержит BI-кластеры. При старте базы данных СУБД по умолчанию создаёт и форматирует каждый - [Введение](https://rupug.pro/lessons/tune-38/) - Ввод-вывод генерируемый механизмом Before-Imaging, как правило, является первой и наиболее вероятной причиной возникновения узкого места в производительности базы данных. Это связано с тем, что СУБД OpenEdge всегда записывает изменения в BI-файлы прежде, чем эти изменения будут записаны в AI-файлы и в файлы прикладных данных. Кроме того, чтобы быть уверенным в возможности восстановления базы данных в - [Задание 4.6: мониторинг ожиданий локировок и ресурсов](https://rupug.pro/lessons/tune-tryit-14/) - В этом задании необходимо выполнить мониторинг ожиданий локировок (Lock Waits) и ожиданий ресурсов (Resource Waits) в базе данных ATM. Мониторинг ожиданий локировок в PROMON. Запустите PROMON с подключением к базе данных ATM: promon atm В поле Enter your selection введите R&D и нажмите клавишу Enter для перехода к расширенному меню. В меню Main (Top) Menu - [Задание 4.5: тюнинг Shared Memory Overflow Size](https://rupug.pro/lessons/tune-tryit-13/) - В этом задании необходимо выполнить мониторинг параметра старта базы данных Shared Memory Overflow Size (-Mxs) и выполнить его тюнинг. Запустите PROMON с подключением к базе данных ATM: promon atm В поле Enter your selection введите R&D и нажмите клавишу Enter для перехода к расширенному меню. В меню Main (Top) Menu введите цифру 1 и нажмите - [Задание 4.4: тюнинг Storage Object Cache Size](https://rupug.pro/lessons/tune-tryit-12/) - В этом задании необходимо выполнить мониторинг параметра старта базы данных Storage Object Cache Size (-omsize) и выполнить его тюнинг, если необходимо. Запустите PROMON с подключением к базе данных ATM: promon atm В поле Enter your selection введите R&D и нажмите клавишу Enter для перехода к расширенному меню. В меню Main (Top) Menu введите цифру 1 - [Задание 4.3: тюнинг Locks Table Entries](https://rupug.pro/lessons/tune-tryit-11/) - В этом задании необходимо выполнить мониторинг параметра старта базы данных Lock Table Entries (-L) и выполнить его тюнинг, если понадобится. Запустите PROMON с подключением к базе данных ATM: promon atm В поле Enter your selection введите R&D и нажмите клавишу Enter для перехода к расширенному меню. В меню Main (Top) Menu введите цифру 1 и - [Задание 4. Запуск теста](https://rupug.pro/lessons/task-4-running-the-test/) - Заключительным шагом является запуск теста и подтверждение того, что метод getData() работает должным образом. Убедитесь, что вы находитесь в перспективе OpenEdge ABLUnit. С открытым файлом Test_CustomerBE.cls запустите класс как приложение Progress ABLUnit. Нажмите на значок Run. Выберите Run As > Progress ABLUnit Application. Запустился ли он без ошибок? Проверьте выходные файлы, которые были записаны. Если - [Задание 3. Разработка кода для тестового класса](https://rupug.pro/lessons/task-3-developing-code-for-the-test-class/) - Есть три метода, которые вы теперь будете реализовывать в классе test, один для настройки для теста, один для удаления после теста и метод, который будет тестировать метод getData() класса CustomerBE. Чтобы протестировать бизнес-сущность CustomerBE, необходимо сначала определить два элемента данных для тестового класса. Первым элементом данных является набор данных. Включите определение набора данных dsCustomerBE в - [Задание 2. Создание тестового класса для тестирования CustomerBE](https://rupug.pro/lessons/task-2-creating-a-test-class-for-testing-customerbe/) - Далее вы добавите в проект ABLUnit новый класс, который будет использоваться для тестирования класса CustomerBE. Создайте новую папку с именем BusinessEntity в папке ApplicationTesting/tests. В Project Explorer щёлкните правой кнопкой мыши папку tests в ApplicationTesting. Выберите New > Folder. Введите BusinessEntity в качестве имени папки. Щёлкните Finish. Создайте новый класс тестового примера, используя следующие рекомендации: - [Разработка кода для тестового клиента](https://rupug.pro/lessons/developing-code-for-the-test-client/) - После создания тестового клиентского класса вы готовы определить элементы данных для тестового класса, а затем реализовать методы класса. Для тестового клиента, который тестирует бизнес-сущность, вы должны определить два элемента данных. Первый – это элемент данных набора данных. Любой клиент, использующий бизнес-сущность, должен будет определить тот же набор данных, который был определен для бизнес-сущности. Второй элемент - [Процедура создания тестового класса](https://rupug.pro/lessons/procedure-for-creating-a-test-class/) - Классы бизнес-сущностей тестируются с помощью тестовых клиентских классов. Когда в проекте ABLUnit создаётся тестовый клиентский класс с помощью мастера New ABLUnit Test Class, выполняется его связывание с тестируемым классом бизнес-сущности. Мастер создаёт необходимые для тестирования метода класса. Для бизнес-сущности это метод setUp(), метод tearDown() и методы для тестирования общедоступных методов бизнес-сущности. При этом мастер создаёт - [Процедура создания проекта ABLUnit](https://rupug.pro/lessons/procedure-for-creating-an-ablunit-project/) - На предыдущем уроке вы узнали, как написать тестовую процедуру для тестирования класса ABL. Написание тестовых процедур полезно, если вы хотите быстро протестировать изменение в классе, чтобы увидеть, работает ли оно. Однако при разработке большого приложения рекомендуется создать формализованный набор тестов для всех функций приложения. OpenEdge предоставляет среду тестирования под названием ABLUnit, которую можно использовать для - [Задание 4. Создание внешней процедуры сервисного интерфейса и её внутренней процедуры](https://rupug.pro/lessons/task-4-creating-an-external-service-interface-procedure-and-its-internal-procedure/) - Теперь, когда вы разработали метод для бизнес-сущности CustomerBE, вы создадите файл внешней процедуры, который будет служить интерфейсом службы для этой бизнес-сущности. Вы добавите внутреннюю процедуру, которая будет сопоставляться с методом GetData(). В Project Explorer добавьте новую папку с именем ServiceInterface в Server/src: Щёлкните правой кнопкой мыши по папке Server/src. Выберите New -> Folder. Введите ServiceInterface - [Задание 3. Перебор временной таблицы и удаление записей](https://rupug.pro/lessons/task-3-looping-through-a-temporary-table-and-deleting-records/) - Та часть условного выполнения метода GetData(), где вызывающей стороне необходимо вернуть диапазон значений номеров клиентов, требует сокращения данных. То есть вы должны возвращать вызывающему объекту только тот набор данных, который соответствует указанному фильтру. Вы добавите код для перебора временной таблицы и удаления ненужных записей до того, как набор данных будет возвращён вызывающей стороне. После вызова - [Задание 2. Реализация условного выполнения](https://rupug.pro/lessons/task-2-implementing-conditional-execution/) - Одним из параметров метода GetData() является строка фильтра, которая используется для указания того, будет ли при вызове извлекаться диапазон данных о клиентах. Вы добавите код в метод GetData() для проверки фильтра и условного выполнения кода. В методе GetData() добавьте оператор перед оператором return, чтобы проверить, пуст ли pFilter, и если pFilter не пуст, то выполнить - [Задание 1. Чтение файла JSON](https://rupug.pro/lessons/task-1-reading-json-file/) - На этом занятии вы разработаете код для метода GetData() класса бизнес-сущности CustomerBE. Сначала вы добавите код для чтения данных в набор данных из файла JSON, а затем код для возврата набора данных. То, что будет возвращено вызывающей стороне, будет зависеть от предоставленного методу параметра фильтра. Пока вы не реализуете уровень доступа к данным, вы будете - [Введение](https://rupug.pro/lessons/roll-forward-introduction/) - Резервное копирование базы данных позволяет восстановить данные до момента создания резервной копии. Но что произойдёт со всеми завершёнными транзакциями, которые были созданы после последнего резервного копирования, если, например, диск, на котором размещена база данных, будет повреждён? Все эти транзакции будут потеряны если не был задействован механизм восстановления после аварий (database disaster recovery). На этом уроке - [Создание внутренних процедур сервисного интерфейса](https://rupug.pro/lessons/creating-internal-service-interface-procedures/) - Шаблон написания кода для внутренних процедур сервисного интерфейса довольно прост. Вы получаете доступ к статичному экземпляру бизнес-сущности, который работает как синглтон в AVM. Используя этот экземпляр, вы вызываете соответствующий общедоступный метод бизнес-сущности. Пример реализации внутренней процедуры SI_GetData, которая получает доступ к статичному элементу данных Instance класса CustomerBE и использует этот экземпляр для вызова соответствующего общедоступного - [Определение внутренних процедур сервисного интерфейса](https://rupug.pro/lessons/defining-the-internal-procedures-of-the-service-interface/) - После создания файла сервисного интерфейса вы должны определить внутренние процедуры, которые сопоставляются с общедоступными методами бизнес-сущности. Когда вы определяете или изменяете общедоступные методы для класса бизнес-сущности, вам необходимо определить или изменить соответствующие внутренние процедуры для его сервисного интерфейса. Количество и типы параметров для внутренней процедуры сервисной службы должны совпадать с параметрами общедоступного метода класса бизнес-сущности, - [Создание файла процедуры сервисного интерфейса](https://rupug.pro/lessons/creating-a-service-interface-procedure-file/) - Для того чтобы клиенты могли получить доступ к общедоступному методу бизнес-сущности, они должны вызвать конкретную процедуру сервисного интерфейса для этого метода. Это связано с тем, что клиент ABL не может напрямую обращаться к экземплярам статичного класса в другой AVM. Файл сервисного интерфейса состоит из набора процедур, которые сопоставляются с общедоступными методами класса бизнес-сущности. Существует один - [Удаление записи из временной таблицы](https://rupug.pro/lessons/deleting-a-record-from-a-temp-table/) - В некоторых случаях временная таблица, с которой вы работаете, может содержать больше данных, чем вы хотите вернуть клиенту. В таком случае вы можете удалить лишние записи. Синтаксис удаления текущей записи: delete . , имя временной таблицы, из которой вы удаляете запись в пределах блока Пример перебора и удаления Рассмотрим полностью реализованный метод GetData (). Он - [Перебор временной таблицы](https://rupug.pro/lessons/iterating-through-the-temp-table/) - Вы часто будете перебирать временные таблицы для обработки записей, накопления значений или удаления записей перед возвратом данных клиенту. Для перебора временной таблицы используется оператор for each. Вы также можете перебирать подмножество записей, используя условие where для указания критериев. Синтаксис для перебора временной таблицы: for each [where ]: end. , имя временной таблицы, - [Использование частных методов для организации бизнес-логики](https://rupug.pro/lessons/using-private-methods-to-organize-business-logic/) - По мере усложнения кода метода может оказаться полезным разделить часть бизнес-логики на частные вспомогательные методы. Хорошими кандидатами на роль вспомогательных методов являются утилиты, которые можно использовать в нескольких местах вашего класса. Разбивка кода на несколько методов упрощает его понимание и поддержку. Рассмотрим пример частного вспомогательного метода с именем ParseFilter (), который анализирует строку фильтра и - [Использование условных операторов](https://rupug.pro/lessons/using-conditional-operators/) - В коде приложения может быть много мест, где вы должны проверять логические выражения, чтобы определить, должен ли выполняться код. Оператор if проверяет логическое выражение и, если логическое выражение истинно, выполняется оператор или блок операторов. Синтаксис оператора if: if then . if then do: . . end. В - [Чтение данных JSON в набор данных](https://rupug.pro/lessons/reading-json-data-into-a-dataset/) - Набор данных — это ключевой объект, используемый для хранения данных для бизнес-сущности. Как правило, бизнес-сущности необходимо заполнить набор данных соответствующими данными, возможно отфильтровать, а затем вернуть набор данных клиенту. В реальном бизнес-приложении данные для набора данных поступают из базы данных OpenEdge. Вы ещё не научились писать уровни источника данных и доступа к данным приложения, которые - [Задание 1. Реализация синглтон-поведения](https://rupug.pro/lessons/task-1-implementation-of-singleton-behavior/) - На этом занятии вам необходимо добавить статичный конструктор и элемент данных в бизнес-сущность CustomerBE. Это позволит классу работать как синглтон в AVM. После этого вы создадите включаемые файлы, необходимые для определения набора данных, который будет использоваться этой бизнес-сущностью. В завершение включите набор данных в качестве элемента данных класса CustomerBE. Для реализации поведения класса бизнес-сущности как - [Задание 2. Создание включаемых файлов для временных таблиц набора данных](https://rupug.pro/lessons/task-2-creating-included-files-for-temporary-dataset-tables/) - В этом задании необходимо создать проект с именем CommonInfrastructure, который будет содержать код, используемый как клиентской, так и серверной частями приложения. Создаваемый набор данных для бизнес-сущности CustomerBE должен использовать данные о клиентах, заказах и элементах заказов, которые будут поступать из базы данных Sports2000. В этом задании вы создадите включаемые файлы и определите временные таблицы, подобные - [Задание 3. Создание включаемого файла для набора данных](https://rupug.pro/lessons/task-3-creating-an-included-file-for-a-data-set/) - Теперь, когда вы создали включаемые файлы для временных таблиц набора данных, вы создадите включаемый файл для определения набора данных, который будет использоваться бизнес-сущностью CustomerBE. Создайте включаемый файл dsCustomerBE.i в папке Include: Щёлкните правой кнопкой мыши по папке Include. В открывшемся меню выберите пункт New -> ABL Include. Введите dsCustomerBE.i в качестве имени файла. Щёлкните по - [Задание 4. Добавление набора данных в класс](https://rupug.pro/lessons/task-4-adding-a-dataset-to-a-class/) - В завершение занятия вы добавите набор данных в качестве элемента данных класса CustomerBE. Для того, чтобы иметь возможность включать файлы из проекта CustomerInfrastrucure в класс CustomerBE необходимо добавить папки src и bin из этого проекта в PROPATH проекта Server. Для этого сделайте следующее: Щёлкните правой кнопкой мыши по проекту Server. Выберите пункт меню Properties. Перейдите - [Включение определения набора данных в файл класса](https://rupug.pro/lessons/including-a-dataset-definition-in-a-class-file/) - Когда вы включаете определение набора данных в файл класса, вы указываете значение параметра видимости. Это значение видимости используется для определений набора данных и временной таблицы. Синтаксис для указания значения видимости, которое будет передано во включаемый файл: { [& = ""]} Чтобы определить набор данных dsCustomerBE в классе, вы указываете его включаемый файл следующим образом: {include/dsCustomerBE.i - [Включение определений временных таблиц в файл определения набора данных](https://rupug.pro/lessons/including-temporary-table-definitions-in-a-dataset-definition-file/) - Вспомните, что в качестве наилучшей практики вы создали отдельные включаемые файлы для временной таблицы и определений наборов данных. Чтобы использовать определение набора данных в своём приложении, вы должны сначала включить определения временной таблицы в файл определения набора данных. После этого вы включаете определение набора данных в свой класс или файл процедуры. Примечание: Параметр видимости не - [Отношения между временными таблицами](https://rupug.pro/lessons/relationships-between-temporary-tables/) - В рамках определения набора данных вы должны определить отношения родитель-потомок между временными таблицами. Это позволяет заполнить набор данных связанными данными. Например, если вы хотите заполнить набор данных данными для определенного клиента, вы можете использовать отношения для получения данных клиента, за которыми следуют заказы для этого клиента, а затем строки заказа для каждого заказа. Чтобы указать - [Определение набора данных](https://rupug.pro/lessons/defining-a-data-set/) - Перед определением набора данных у вас уже должны быть определены все временные таблицы, которые будут включены в него. Имена наборов данных рекомендуется начинать с префикса «ds», за которым следует имя бизнес-объекта или что-то другое, имеющее смысл. Упрощённый синтаксис для определения набора данных. define [{&}] dataset for [, ]. visibility-parameter, - заполнитель, - [Включаемые файлы](https://rupug.pro/lessons/included-files/) - Как сообщалось ранее, рекомендуется определять временные таблицы и наборы данных в отдельных включаемых файлах. Включаемый файл можно вставить в любое место вашего кода. В примере приложения мы используем проект CommonInfrastructure для встраивания включаемых файлов и других ресурсов, которые совместно используются клиентской и серверной частями приложения. Включаемый файл должен быть размещён в месте, доступном для частей - [Уникальный первичный индекс для временной таблицы](https://rupug.pro/lessons/unique-primary-index-for-a-temp-table/) - При создании временной таблицы рекомендуется определить по возможности уникальное поле, по которому будет строиться уникальный первичный индекс. При этом временная таблица может иметь только один уникальный первичный индекс. Примечание. Большинство таблиц базы данных содержат более одного индекса. Для лучшей производительности рекомендуется определять те же индексы во временной таблице, что и для таблицы из базы данных. - [Временные таблицы ABL](https://rupug.pro/lessons/abl-temp-tables/) - Временная таблица содержит записи, и каждая запись имеет набор предопределённых полей. Вы должны определить поля во временной таблице, чтобы они соответствовали типам в базе данных. Как и таблицу базы данных, временные таблицы можно индексировать для повышения производительности. Рекомендуется начинать имена временных таблиц с префикса «tt», за которым следует имя таблицы базы данных. Примечание. Временные таблицы - [Наборы данных](https://rupug.pro/lessons/data-sets/) - Напомним, что рекомендуется определять набор данных для представления бизнес-данных для бизнес-сущности. Набор данных состоит из одной или нескольких временных таблиц, связанных друг с другом. Временная таблица похожа на таблицу базы данных и может содержать множество типов данных. И наборы данных, и временные таблицы являются объектами в памяти. Набор данных используется как серверным кодом, так и - [Самоконтроль](https://rupug.pro/lessons/самоконтроль/) - [Определение статического конструктора](https://rupug.pro/lessons/defining-a-static-constructor/) - Статический конструктор используется для инициализации статического элемента данных для класса бизнес-сущности. Синтаксис для определения статического конструктора: constructor static (): end constructor. Элемент синтаксиса Описание Должен совпадать с именем класса в определении класса. ABL код для реализации функциональности конструктора. Пример. Пример кода статического конструктора класса CustomerBE . Обратите - [Определение статического элемента данных](https://rupug.pro/lessons/defining-a-static-data-element/) - Как вы узнали ранее, вы должны убедиться, что в AVM работает только один экземпляр бизнес-сущности, чтобы одновременно можно было обслуживать только одного клиента. Один экземпляр класса в AVM называется синглтоном. Далее вы реализуете бизнес-сущность как синглтон, определяя статический элемент данных и статический конструктор для класса. Элементы данных переменных и свойств также могут быть статическими элементами - [Задание 2. Создание и определение CustomerBE](https://rupug.pro/lessons/task-2-creating-and-defining-a-customerbe/) - Теперь вы создадите класс CustomerBE, который будет использовать IBusinessEntity в качестве класса интерфейса. Создайте файл ABL-класса CusomerBE.cls с конструктором по умолчанию. Щёлкните правой кнопкой мыши по папке BusinessEntity. Выберите New > ABL Class. Введите CustomerBE в качестве имени класса. Щёлкните по кнопке Add в области Implements. Прокрутите или выполните поиск класса IBusinessEntity и выберите его. - [Задание 1. Создание и определение IBusinessEntity](https://rupug.pro/lessons/task-1-creating-and-defining-ibusinessentity/) - Для разработки поместите файлы классов, связанные с бизнес-сущностями, в новую папку с именем BusinessEntity в папке Server/src. Создайте папку BusinessEntity в проекте сервера. Щёлкните правой кнопкой по папке Server/src в области Project Explorer. Выберите New > Folder. В качестве имени папки укажите BusinessEntity. Щёлкните Finish. Создайте файл класса интерфейса IBusinessEntity.cls. Щёлкните правой кнопкой мыши по - [Определение классов бизнес-сущностей](https://rupug.pro/lessons/defining-business-entity-classes/) - Определение и разработка класса бизнес-сущности включает ряд задач: Определение класс интерфейса, который будет использоваться всеми классами бизнес-сущностей. Определение класс бизнес-сущности, используя класс интерфейса. Добавление кода, чтобы убедиться, что один экземпляр бизнес-сущности работает в AVM. Определение набора данных для класса бизнес-сущности. Реализация конструкторов, методов и деструктора класса бизнес-сущности. В этом разделе вы узнаете, как определить класс - [Бизнес-сущности](https://rupug.pro/lessons/business-entities/) - Далее вы узнаете, как определять, разрабатывать и тестировать классы бизнес-сущности (Business Entity) представляющие бизнес-логику приложения OERA. Вы узнаете: как определить класс бизнес-сущности с помощью класса интерфейса и как написать код для запуска класса бизнес-сущности в качестве «singleton»; как определять временные таблицы и наборы данных с помощью включаемых файлов и включать их в качестве элементов данных - [Задание 4. Написание тестовой процедуры для класса Department](https://rupug.pro/lessons/task-4-writing-a-test-procedure-for-the-department-class/) - В этом задании вы включите код из процедуры, написанной во время выполнения предыдущего задания, в новую процедуру для тестирования класса Department. Поскольку класс Department содержит экземпляры класса Employee, вам потребуется прочитать данные из файла для инициализации экземпляров класса Employee, как вы делали ранее. Вы напишите инструкции для тестирования конструктора и каждого метода класса Department и - [Задание 5. Тестирование класса Department](https://rupug.pro/lessons/task-5-testing-the-department-class/) - В этом задании вы запустите написанную вами тестовую процедуру и подтвердите, что написанный вами класс Department ведёт себя правильно. Выполните процедуру TestDepartment.p. Правильно ли он работает и правильно ли выполняется класс Department? Просмотрите выходной файл. В открытом файле TestDepartment.p щёлкните по иконке Run. Выберите Progress OpenEdge Application. Щёлкните OK. Откройте файл TestDepartement.txt. Если во время - [Задание 3. Тестирование и отладка класса Employee](https://rupug.pro/lessons/task-3-testing-and-debugging-the-employee-class/) - В этом задании вам необходимо проверить работу класса Employee c помощью процедуры тестирования, которую вы подготовили ранее, и с помощью отладчика по шагам пройти через код чтобы увидеть, как изменяются значения переменных по мере его выполнения. Попробуйте выполнить процедуру TestEmployee.p, для этого: откройте файл в редакторе Developer Studio и щёлкните по иконке Run; выберите Progress - [Задание 2. Написание процедуры тестирования для класса Employee](https://rupug.pro/lessons/task-2-writing-a-test-procedure-for-the-employee-class/) - Напишите процедуру, которая считывает данные из файла. Данные, которые вы читаете из файла, будут использоваться для инициализации экземпляров класса Employee. Вы должны написать операторы для тестирования конструктора и каждого метода класса Employee. Используйте оператор message для записи данных в файл. Создайте новый каталог с именем Test внутри каталога Server/src/Sandbox: В Progress Explorer выберите каталог Sandbox. - [Задание 1. Подготовка Developer Studio к отладке](https://rupug.pro/lessons/task-1-preparing-developer-studio-for-debugging/) - Прежде чем использовать отладчик в Developer Studio, необходимо подготовить среду OpenEdge к отладке. Выполните следующие действия, чтобы настроить среду для отладки: Выберите пункт верхнего меню Window -> Preferences. Перейдите в область Progress OpenEdge -> Debug. Установите флаг Enable property evaluation. Щёлкните по кнопке Apply and Close. Откройте командную строку Proenv от имени администратора. Введите следующую - [Просмотр информации во время выполнения](https://rupug.pro/lessons/viewing-information-during-runtime/) - Когда выполнение приостанавливается в заданной строке в перспективе отладки, вы можете просмотреть все значения переменных и свойств в этой заданной точке выполнения. Если переменная или свойство является элементом данных, то можно просмотреть значения для экземпляра класса. Если вы хотите продолжить выполнение процесса, вы можете использовать следующие значки в окне отладки, чтобы: Возобновить выполнение (до конца - [Точки останова в отладчике](https://rupug.pro/lessons/breakpoints-in-the-debugger/) - Перед началом отладки необходимо установить хотя бы одну точку останова. Точка останова в исходном файле – это маркер, который сообщает отладчику, что при обнаружении определенного оператора процесс будет приостановлен. Во время приостановки процесса можно просмотреть информацию о нем, например значения свойств или переменных. Линия, где процесс приостановлен, выделена зелёным цветом. В этом примере точки останова - [Окно отладки](https://rupug.pro/lessons/debugging-window/) - После того как вы щёлкните значок отладки , вам будет представлена перспектива отладки. Перспектива отладки выглядит иначе чем перспектива редактора OpenEdge. Вы можете переключаться между этими двумя видами, выбрав перспективу в правом верхнем углу окна Developer Studio. В сессии отладки вы можете просматривать информацию и контролировать пошаговый проход через ABL-код. Перспектива отладки содержит область для - [Подготовка Developer Studio к отладке кода](https://rupug.pro/lessons/preparing-developer-studio-for-code-debugging/) - По мере разработки ABL-кода вы можете столкнуться с ситуацией, когда код компилируется без ошибок, но не выполняется правильно. Конечно, вы можете добавить операторы сообщений в свой код в выбранных местах чтобы понять, какие значения переменных используются во время выполнения, но самый простой способ понять, как выполняется ваш код, – это использовать отладчик в Developer Studio. - [Пример завершения теста](https://rupug.pro/lessons/example-of-test-completion/) - После завершения тестирования необходимо убедиться, что экземпляр класса удалён, а выходной файл закрыт. Удаление экземпляров класса важная процедура, которая позволяет избежать утечек памяти. Далее приведён полный код процедуры тестирования класса Employee. block-level on error undo, throw. using Sandbox.TestClasses.Employee. /* переменная для хранения экземпляра Employee */ define variable Emp as Employee no-undo. /* переменная для хранения - [Пример тестирования экземпляра класса](https://rupug.pro/lessons/example-of-testing-an-instance-of-a-class/) - После подготовки в процедуре тестирования необходимо написать код, который будет проверять каждый созданный вами экземпляр. Вы должны вызвать каждый метод, чтоб убедиться в правильности его работы. По мере необходимости вы можете использовать операторы message для записи данных в выходной файл, которые помогут вам документировать поведение вашего класса во время тестирования. В следующем примере был добавлен - [Пример подготовки к тестированию экземпляра класса](https://rupug.pro/lessons/example-of-preparing-for-testing-an-instance-of-a-class/) - После того как вы определили и разработали класс, вы должны его протестировать. Обычный способ тестирования класса – это написать процедуру, которая создаёт экземпляры класса и выполняет каждый конструктор, метод и деструктор. Полезно вести запись результатов тестирования, как правило, в файле. Это позволяет сравнивать результаты тестов при внесении изменений в класс. Во время создания тестовой процедуру - [Задание 2. Реализация методов для класса Department](https://rupug.pro/lessons/task-2-implementation-of-methods-for-the-department-class/) - В отличие от класса Employee, который использует конструктор по умолчанию и метод Initialize(), для класса Department вся инициализация экземпляра выполняется в конструкторе. Далее добавим код в конструктор и методы класса Department. Добавьте следующий код в конструктор: Присвойте свойству DeptName значение входящего параметра pDeptName. Присвойте свойству ExpenseCode значение входящего параметра pExpenseCode. Установите размер массива Employees используя - [Задание 3. Определение методов класса Employee](https://rupug.pro/lessons/task-3-defining-methods-of-the-employee-class/) - Задание Описать методы класса Employee: Initialize() SetVacationHours() SetJobTitle() GetInfo() GetName() Реализация Initialize() – метод с областью видимости public, который возвращает void. Входными параметрами для этого метода служат значения всех атрибутов класса Employee (описанные ранее свойства класса). Установите курсор в пустую строку после описания конструктора. Щёлкните правой кнопкой мыши и в открывшемся меню выберите пункт Source - [Задание 1. Реализация методов для класса Employee](https://rupug.pro/lessons/task-1-implementation-of-methods-for-the-employee-class/) - В этом задании вам необходимо добавить код к методам класса, которые вы определили на предыдущем занятии. Откройте в редакторе файл класса Employee. Реализуйте код для метода Initialize (). Назначьте значение входного параметра каждому из элементов данных. Подсказка: используйте конструкцию PhoneNumbers[x] = pPhones[x], чтобы инициализировать три элемента в массиве номеров телефонов PhoneNumbers. Реализуйте метод SetVacationHours() присвоив - [Удаление экземпляра класса](https://rupug.pro/lessons/deleting-an-instance-of-a-class/) - Когда вы закончите работу с экземпляром другого класса, вы должны удалить его. Когда экземпляр класса удаляется, он вызывает деструктор, если класс уже определен. Синтаксис: delete object [no-error]. Здесь, – Переменная или свойство, содержащее ссылку на экземпляр класса. Рассмотрим деструктор для класса Department. Когда экземпляр класса Department завершает свою работу, экземпляры класса Employee больше не - [Вызов общедоступного метода экземпляра класса](https://rupug.pro/lessons/calling-a-public-method-of-a-class-instance/) - После создания экземпляра другого класса можно вызвать любой общедоступный конструктор, метод или деструктор, определенный в этом классе. Если метод возвращает значение, вы можете использовать это значение в любом месте вашего кода. Упрощённый синтаксис для вызова метода класса: :( [ ][,…]). Здесь, – Переменная или свойство, содержащее ссылку на экземпляр класса. – Имя метода, - [Доступ к общедоступному элементу данных экземпляра класса](https://rupug.pro/lessons/access-to-a-public-data-element-of-a-class-instance/) - После создания экземпляра другого класса можно получить доступ к любому общедоступному элементу данных в экземпляре класса. Упрощённый синтаксис для доступа к общедоступному элементу данных класса: : Здесь, – Переменная или свойство, содержащее ссылку на экземпляр класса. – Имя элемента данных в классе. Этот элемент данных должен быть public. Предположим вы определили некоторые из - [Создание экземпляра другого класса](https://rupug.pro/lessons/creating-an-instance-of-another-class/) - Когда вы создаёте экземпляр другого класса, вы вызываете конструктор для этого класса, используя ключевое слово ABL new. Конструктор возвращает значение, которое является ссылкой на вновь созданный экземпляр класса. Вы должны присвоить ссылку на экземпляр класса переменной или свойству, тип которого является именем класса. Класс, который вы вызываете, может иметь несколько конструкторов, каждый со своим собственным - [Определение переменной или свойства типа класса](https://rupug.pro/lessons/defining-a-variable-or-property-of-a-class-type/) - Чтобы получить доступ к общедоступным элементам данных и методам экземпляра класса, необходимо сначала определить переменную или свойство, которое будет содержать ссылку на экземпляр. Указанный вами тип является определяемым пользователем типом, который является именем класса. Когда вы определяете этот элемент данных, вы указываете его видимость точно так же, как и для других элементов данных. Если вы - [Использование оператора USING](https://rupug.pro/lessons/using-the-using-operator/) - Помните, вы можете получить доступ к общедоступным элементам данных и методам экземпляра класса из любой части вашего приложения. Для этого необходимо создать или получить экземпляр класса, к которому вы хотите получить доступ. Как только у вас есть ссылка на экземпляр, вы можете получить доступ к любому из его открытых элементов данных и методов. Например, класс - [Доступ к методу класса внутри класса,](https://rupug.pro/lessons/access-to-a-class-method-within-a-class/) - В конструкторах, методах или деструкторах класса можно получить доступ к любому другому методу, определенному в классе. Если метод возвращает значение, вы можете использовать это значение в любом месте вашего кода. Вот синтаксис вызова метода класса из класса: ( [ ][,…]) method Имя метода в данном экземпляре класса. parameter Ноль или более значений, которые передаются методу - [Доступ к элементу данных массива](https://rupug.pro/lessons/access-to-an-array-data-member/) - Способ доступа к элементу данных массива аналогичен доступу к любому другому элементу данных, за исключением того, что необходимо указать значение индекса (номер элемента в массиве). Как и в случае с другими элементами данных вы можете использовать ключевое слово «this-object:». Синтаксис для установки значения элемента массива: [index] = . defined-extent Имя массива, которое также служит именем - [Определение размера массива](https://rupug.pro/lessons/determining-the-size-of-an-array/) - Если был описан неопределённый массив, т. е. массив без указания количества элементов массива, то необходимо явно указать его размер в своём коде, прежде чем вы сможете добавлять в него элементы. Установка размера обычно выполняется в конструкторе класса. Синтаксис установки размера массива в коде: extent () = . defined-extent Имя массива, которое также служит именем свойства - [Доступ к элементу данных в классе](https://rupug.pro/lessons/accessing-a-data-member-in-a-class/) - На предыдущих уроках вы научились писать ABL-код для определения частей класса, включая элементы данных, конструкторы, методы и деструктор. Но кроме того необходимо написать ABL-код, который будет выполняться этими частями класса. Вы уже знаете, как определять переменные, присваивать им значения, выводить на экран и записывать данные в файл используя оператор message, и выходить из блока с - [Задание 6. Модификация конструктора и добавление методов класса Department](https://rupug.pro/lessons/task-6-modification-of-the-constructor-and-adding-methods-of-the-department-class/) - Задание Добавить входящие параметры в конструктор и несколько методов класса Department. Реализация Модифицируйте конструктор класса добавив в него входящие параметры pDeptName, pMaxNumEmployees и pExpenseCode: Установите курсор в область параметров конструктора. Добавьте следующий код для описания этих параметров: input pDeptName as character, input pMaxNumEmployees as integer, input pExpenseCode as character Определите общедоступный метод AddEmployee(), который возвращает - [Задание 5. Определение атрибутов класса Department](https://rupug.pro/lessons/task-5-defining-attributes-of-the-department-class/) - Задание Добавить атрибуты DepName и ExpenceCode в класс Department. Реализация Опишите свойства DepName и ExpenseCode с типом данных character, областью видимости public и областью видимости private для метода доступа Set: В редакторе установите курсор в пустую строку перед описанием конструктора класса. Щёлкните правой кнопкой мыши и выберите пункт Source -> Add Property. В поле Property - [Задание 4. Создание класса Department](https://rupug.pro/lessons/task-4-creating-the-department-class/) - Задание Создать файл класса Department, который будет содержать данные и функциональность для работы с отделами компании. Реализация В Project Explorer в каталоге src проекта Server выделите каталог TestClass. Создайте в этом каталоге класс Department, который будет содержать деструктор и конструктор по умолчанию, и который вы позже модифицируете для работы с параметрами. Используйте мастер New ABL - [Задание 2. Определение атрибутов класса Employee](https://rupug.pro/lessons/task-2-defining-attributes-of-the-employee-class/) - Задание Добавить атрибуты в класс Employee с областью видимости public и методами доступа Set с областью видимости private: FirstName (character) LastName (character) JobTitle (character) EmpNum (integer) VacationHours (integer) Для описания свойств используйте мастер Add Property. Реализация В открытом файле Employee.cls установите курсор в пустую строку перед описанием конструктора. Щёлкните правой кнопкой мыши и в открывшемся - [Задание 1. Создание класса Employee](https://rupug.pro/lessons/task-1-creating-the-employee-class/) - Задание Создать класс Employee, который будет содержать данные и функциональность для работы с учетными данными сотрудников компании. Реализация В Project Explorer в каталоге src проекта Server создайте каталог Sandbox: Щёлкните правой кнопкой мыши по каталогу src. В открывшемся меню выберите пункт New -> Folder. Введите имя Sandbox для нового каталога. Щёлкните мышью по кнопке Finish. - [Деструктор класса](https://rupug.pro/lessons/class-destructor/) - Деструктор – это необязательный метод, который выполняется во время удаления экземпляра класса из памяти. Обычно деструктор применяется если вашему классу необходимо выполнить некоторые действия перед удалением экземпляра. Например, вы можете создать деструктор для класса Employee, который после удаления экземпляра Employee выполнит удаление ссылки на него в экземпляре Department. Упрощённый вариант синтаксиса деструктора класса, следующий: - [Методы класса](https://rupug.pro/lessons/methods-of-the-class/) - Методы класса используются для реализации поведения и функциональности класса. В момент создания экземпляра класса для его атрибутов выделяется память. Методы класса оперируют атрибутами экземпляра класса. Некоторые методы могут иметь область видимости private или protected, такие методы могут быть вызваны только другими методами этого же класса. Другие методы могут иметь видимость public, в этом случае они - [Конструкторы класса](https://rupug.pro/lessons/class-constructors/) - Конструктор класса — это специальный метод, который создаёт экземпляр класса. Хорошей практикой считается указание области видимости конструктора как public, что позволяет другим частям приложения создавать экземпляры этого класса. Класс может иметь более одного конструктора, при этом каждый из них имеет разный список параметров. Это полезно, когда необходимо создавать экземпляры для разных частей приложения. Например, у - [Использование массивов в ABL](https://rupug.pro/lessons/using-arrays-in-abl/) - Язык ABL поддерживает одномерные массивы, в которых элементы массива имеют одинаковый тип данных. Этим массивы могут быть фиксированного размера или неопределённого (устанавливается во время выполнения). Любую переменную или свойство можно определить в качестве массива. Первый элемент массива имеет индексное значение 1. Обычно массивы используются для хранения небольших наборов данных. Поскольку значения элементов массива не индексируются, - [Части ABL-класса](https://rupug.pro/lessons/parts-of-the-abl-class/) - ABL-класс содержит определение атрибутов, определение и реализацию конструкторов, методов и деструкторов. Конструкторы используются для создания экземпляра класса во время выполнения. Деструктор используется для очистки ресурсов после удаления экземпляра класса. Атрибуты класса Атрибуты класса, на рисунке отмечены как «Customer data definitions», используются для хранения значений для экземпляра класса во время выполнения. Каждый созданный экземпляр класса имеет - [Использование мастера New ABL Class](https://rupug.pro/lessons/using-the-new-table-class-wizard/) - Мастер New ABL Class помогает в создании ABL-класса. Мастер вызывается в каталоге рабочего пространства, в котором планируется создания файла класса. Такие каталоги обычно находятся в проекте внутри каталога src. Мастер автоматически устанавливает в качестве пакета (Package) расположение в структуре каталогов, где был он был открыт. Вы должны указать имя класса. Хорошей практикой является выбор генерации - [Именование классов и пакетов](https://rupug.pro/lessons/naming-class-packages/) - Имя класса должно указывать на его назначение. Оно должно начинаться с буквы и может содержать буквы, цифры, знаки подчёркивания и дефисы. Имя класса должно совпадать с именем файла с расширением «.cls», который содержит описание класса. Например, файл Employee.cls содержит описание класса Employee, а файл Department.cls содержит класс Department. Пакет – это путь к каталогу, в - [Введение](https://rupug.pro/lessons/abl-classes-introduction/) - На предыдущем уроке вы познакомились с процедурным программированием на языке ABL. Многие из ABL-операторов, которые вы изучили, также могут быть использованы для написания кода ABL-классов. На этом уроке вы познакомитесь с объектно-ориентированным программированием в языке ABL. Вы научитесь описывать атрибуты, конструкторы, методы и деструкторы класса. Также узнаете, как получить доступ к атрибутам класса и как - [Задание 4. Создание проекта для серверной части](https://rupug.pro/lessons/task-4-creating-a-project-for-the-server-side/) - Задание Создать проект для серверной части приложения. Реализация В рабочей области выберите пункт меню File -> New -> OpenEdge Project. В мастере создания нового проекта New OpenEdge Project укажите имя проекта Server и щёлкните по кнопке Next. На следующей странице в секции Project layout выберите Use separate source and r-code directories и измените значение поля - [Задание 3. Создание проекта для клиентской части](https://rupug.pro/lessons/task-3-creating-a-project-for-the-client-part/) - Задание Создайте проект для хранения программного кода клиентской части приложения. Реализация В рабочей области выберите пункт меню File -> New -> OpenEdge Project. В мастере создания нового проекта New OpenEdge Project укажите имя проекта Client и щёлкните по кнопке Next. Обратите внимание, мы не выбрали категорию проекта, поэтому по умолчанию категория проекта будет Basic OpenEdge. - [Задание 2. Настройка параметров рабочей области](https://rupug.pro/lessons/task-2-setting-up-workspace-parameters/) - Задание Настроить некоторые параметры рабочей области, которые будут применяться ко всем проектам, создаваемым для разработки на языке ABL, и которые сделают вашу работу проще. Реализация В созданной рабочей области выберите пункт меню Window -> Preferences В левой панели выберите Progress OpenEdge. На правой панели выберите ссылку Configure OpenEdge Project Startup Parameters Убедитесь, что номера портов - [Задание 1. Создание рабочей области](https://rupug.pro/lessons/task-1-creating-a-workspace/) - Новая рабочая область может быть размещена в любом месте вашей системы. Однако для своего удобства создайте в рабочем каталоге OpenEdge (обычно это C:\OpenEdge\WRK\) подкаталог abldev, в котором во время открытия Progress Developer Studio for OpenEdge мы создадим рабочее пространство для наших проектов. - [Задание 1. Создание файла процедуры](https://rupug.pro/lessons/task-1-creating-a-procedure-file/) - Задание Создать файл процедуры в каталоге Test проекта Server. Реализация В Developer Studio разверните проект Server в области Project Explorer. Щёлкните правой кнопкой мыши на каталоге src и выберите в меню New -> Folder. В открывшемся мастере создания нового каталога укажите имя каталога Test и щёлкните по кнопке Finish. В области Project Explorer щёлкните правой - [Задание 2. Добавление операторов в процедуру](https://rupug.pro/lessons/task-2-adding-operators-to-the-procedure/) - Задание Добавить операторы в новую процедуру. Файл процедуры Proc1.p сразу после создания откроется в редакторе Developer Studio. Если вы успели его закрыть, то откройте. Напомню, файл Proc1.p находится в проекте Server в каталоге src\Test\. Реализация В секцию Definitions добавьте описание переменной CustomerName с типом данных character. define variable CustomerName as character no-undo. Обратите внимание, если вы - [Задание 3. Тестирование процедуры](https://rupug.pro/lessons/task-3-testing-the-procedure/) - Задание Выполнить процедуру в AVM проекта Server для проверки правильность её работы. Реализация Щёлкните по меню Run и выберите пункт Run As -> Progress OpenEdge Application. На экране должно появиться следующее окно. Для улучшения вашего опыта работы с Developer Studio дополнительно самостоятельно сделайте следующее: Закройте процедуру и выполните её из Project Explorer. Измените процедуру так, - [Задание 4. Написание кода внешней процедуры с параметрами](https://rupug.pro/lessons/task-4-writing-the-code-of-an-external-procedure-with-parameters/) - Задание. Создайте процедурный файл, в котором ABL-код процедуры использует параметры для работы. - [Задание 6. Разработка и тестирование внутренней процедуры, вызываемой в пределах процедурного файла](https://rupug.pro/lessons/task-6-development-and-testing-of-an-internal-procedure-called-within-a-procedural-file/) - Задание Создать внутреннюю процедуру в процедурном файле и протестировать её. Реализация В каталоге Server\src\Utility сделайте копию процедуры GenPO.p, для этого: Щёлкните правой кнопкой мыши по файлу процедуры GenPO.p в Project Explorer и выберите пункт Copy. Щёлкните правой кнопкой мыши по каталогу Utility и выберите пункт Paste. Введите имя нового процедурного файла GenPO2.p. По умолчанию при - [Задание 7. Разработка и тестирование внутренних процедур в составе библиотеки](https://rupug.pro/lessons/task-7-development-and-testing-of-internal-procedures-in-the-library/) - Задание Создать набор внутренних процедур в процедурном файле, который будет представлять из себя библиотеку в серверном проекте. Затем создать тестовую процедуру в клиентском проекте, которая будет использовать созданную вами библиотеку. Реализация В каталоге Server\src\Utility создайте новый процедурный файл с именем GenPOProcs.p, также как вы создавали процедурные файлы ранее. Этот процедурный файл не будет содержать основной - [Задание 5. Вызов серверной процедуры из клиентской процедуры](https://rupug.pro/lessons/task-5-calling-a-server-procedure-from-a-client-procedure/) - Задание Создать тестовую процедуру для вызова внешней процедуры из проекта Server. Перед запуском тестовой процедуры вы должны добавить серверные каталоги Server\src и Server\bin в PROPATH проекта Server, для этого воспользуйтесь инструкцией из раздела «Определение местоположения процедуры во время вызова». Реализация Создайте новый каталог с именем Test в каталоге src проекта Client: В Project Explorer щёлкните - [Вызов внутренних процедур другими частями приложения](https://rupug.pro/lessons/calling-internal-procedures-by-other-parts-of-the-application/) - Вы уже знаете, как вызвать внешнюю процедуру из другой части приложения с помощью оператора run. Теперь рассмотрим, как вызываются внутренние. Для того чтобы вызвать внутреннюю процедуру из другой части приложения используются handle-переменные. Сценарий вызова: Описать handle-переменную, которая будет содержать дескриптор для процедурного файла, содержащего внутреннюю процедуру. Создать handle для процедуры. Для каждой вызываемой внутренней процедуры - [Внутренние процедуры](https://rupug.pro/lessons/internal-procedures/) - Внутренние процедуры помогают разработчику в организации программного кода. Такие процедуры могут описываться как отдельно во внешнем процедурном файле, так и организовываться в библиотеки процедур без использования основного блока кода. Если внутренняя процедура описывается во внешнем процедурном файле, то она вызывается только внутри процедурного файла. Например, в файле вместо выполнения конкатенации строк для создания номера платежа - [Вызов процедуры из другой части приложения](https://rupug.pro/lessons/calling-a-procedure-from-another-part-of-the-application/) - Внешние процедуры – это процедуры, которые могут быть вызваны другой частью приложения. Синтаксис вызова внешний процедур с применением параметров следующий: run [()]. external-proc-file Имя процедурного файла. Если файл процедуры находится в том же каталоге, где размещена вызывающая процедура, или если каталог вызываемой процедуры указан в PROPATH, то достаточно указать имя файла. Если каталог процедуры - [Определение местоположения процедуры во время вызова](https://rupug.pro/lessons/determining-the-location-of-a-procedure-during-a-call/) - Во время вызова процедуры AVM должна иметь возможность определить местоположение её файла. Для этого используется переменная среды окружения PROPATH. PROPATH – это набор абсолютных и относительных путей к каталогам, в которых хранятся файлы с ABL-кодом. PROPATH используется AVM в Developer Studio в проектах во время разработки, а также сервером приложений во время выполнения. Например, чтобы - [Параметры процедуры](https://rupug.pro/lessons/procedure-parameters/) - Параметры процедуры предназначены для передачи данных внутрь или из процедуры. Параметры могут иметь как внешние, так и внутренние процедуры. Параметр – это значения встроенных типов данных ABL, таких как character, integer или handle. Параметры могут быть входящие (input), исходящие (output), а также гибридные (input-output), т. е. одновременно и входящие, и исходящие. Описание параметров помещается в - [Внешние и внутренние процедуры](https://rupug.pro/lessons/external-and-internal-procedures/) - В языке ABL есть два типа процедур: внешние и внутренние. Эти процедуры создаются в файлах с расширением «.p». Но между ними есть отличия в том, как они определяются, как вызываются и как они используются в приложении. Внешняя процедура определена основным блоком (Main Block) в файле процедуры. В процедурном файле может быть только одна внешняя процедура. - [Тестирование процедуры](https://rupug.pro/lessons/testing-the-procedure/) - После того, как код процедуры написан, сохранён и вы убедились, что отсутствуют ошибки компиляции, необходимо протестировать работу процедуры, чтобы убедиться, что она работает правильно. Когда вы сохраняете ABL-процедуру, код компилируется в специализированном процессе, называемом ABL Virtual Machine (AVM). По умолчанию каждый проект имеет собственную AVM. Скомпилированный код, называемый R-код, помещается в каталог bin вашего проекта. - [Сохранение файла процедуры](https://rupug.pro/lessons/saving-the-procedure-file/) - По мере внесения изменений файл процедуры необходимо сохранять. В Developer Studio во время сохранения файла процедуры выполняется компиляция ABL-кода в R-код. Если во время компиляции обнаруживаются ошибки в коде, то они отображаются на экране и в виде списка на панели Problems. Проверить синтаксис ABL-кода вы можете и не прибегая к сохранению. Для этого достаточно нажать - [Добавление операторов в главный блок](https://rupug.pro/lessons/adding-operators-to-the-main-block/) - После того, как вы описали переменные для процедуры, необходимо добавить код, который будет с ними работать для достижения необходимой функциональности процедуры. Рассмотрим по шагам как: присваивать значения переменным; выводить информацию с помощью оператора message; выполнить возврат из процедуры. Присваивание значения переменной Оператор присваивания (=) в ABL аналогичен операторам присваивания в других языках программирования. Синтаксис оператора - [Переменные](https://rupug.pro/lessons/variables/) - Переменные – это место для хранения данных во время выполнения. Вы можете описать переменные в любом месте вашего кода, но лучшей практикой является их описание в рамках того блока кода, в котором они будут использоваться. Например, если процедура имеет один главный блок, то вы должны описать все переменные в секции Definitions. Если процедура имеет вложенные - [Разработка процедур](https://rupug.pro/lessons/development-of-procedures/) - ABL-процедуры – это содержащие ABL-операторы блоки кода. Структура процедуры может быть простой с единственным блоком кода, или может содержать несколько блоков, которые могут быть вложенными. Процедура также может иметь входящие и исходящие параметры. В приложениях, использующих OERA-архитектуру, процедуры полезны для создания сервисных интерфейсов для бизнес-сущностей (Business Entity). Кроме того, они могут использоваться для тестирования различных - [Введение](https://rupug.pro/lessons/introduction-to-abl/) - На предыдущем уроке вы узнали о том, что язык ABL поддерживает две парадигмы программирования: процедурную и объектно-ориентированную. Вы можете использовать их как по отдельности, так и вместе в своих разработках. Но даже если вы решите использовать объектно-ориентированное программирование, всё равно в определённых случаях вы будете должны использовать процедурный код. На этом уроке вы познакомитесь с - [Разделение приложения на проекты](https://rupug.pro/lessons/splitting-the-application-into-projects/) - Вы уже знаете, что одна из задач OERA-архитектуры является разделение приложения на клиентскую и серверную части, так как они должны исполняться разными процессами в развёрнутом приложении. Для этого программный код каждой части должен быть размещён в соответствующем отдельном проекте в рабочей области среды разработки. Такой подход упрощает размещение разных частей приложения на разных физических устройствах. - [Отображение номеров строк в коде](https://rupug.pro/lessons/displaying-line-numbers-in-the-code/) - Для разработки и отладки полезно видеть номера строк ABL-кода. Для этого необходимо в настройках рабочей области перейти в раздел General -> Editors -> Test Editors и установить флаг Show line numbers. - [Получение дополнительной справки по синтаксису ABL](https://rupug.pro/lessons/getting-additional-help-on-abl-syntax/) - В настройках рабочей области Developer Studio есть параметры, которые помогут вам улучшить свой опыт разработчика. Для их настройки необходимо перейти в раздел OpenEdge Editor Build выбрав Progress OpenEdge -> Editor -> Build. Здесь рекомендуется всегда устанавливать параметры Compile on save if required и Automatically check syntax. Параметр Compile on save if required позволит всегда иметь - [Настройка стиля ABL-кода](https://rupug.pro/lessons/configuring-the-abl-code-style/) - Существуют специальные параметры настройки стиля ABL-кода, которые вы можете применить для своей среды разработки. Доступ к этим параметрам осуществляется через параметры рабочей области выбрав Progress OpenEdge -> Editor. Отступы (Indentation) упрощают читаемость вашего кода. Обычно редактор создаёт отступы по мере ввода вами кода. Но если вы копируете и вставляете код, отступы могут быть проставлены не - [Настройка среды разработки на языке ABL](https://rupug.pro/lessons/setting-up-an-abl-development-environment/) - Из предыдущих тренингов вы уже знакомы с некоторыми базовыми возможностями Progress Developer Studio for OpenEdge, такими как открытие рабочего пространства, создание OpenEdge-проекта и сборка ABL-приложения. В этом пособии вы узнаете, как писать код, выполнять отладку и тестировать ABL-приложение с помощью Developer Studio, следуя принципам OERA-проектирования. В основном, настройки по умолчанию у рабочей области Developer Studio - [Объектно-ориентированное программирование](https://rupug.pro/lessons/object-oriented-programming/) - Объектно-ориентированное программирование является важным для разработки OERA-приложений, так как позволяет явно моделировать пользователей, системы и объекты, из которых состоят варианты использования приложения. Классы ABL используются для представления пользователей, системы или объектов. Каждый класс содержит описание данных и реализующий поведение код. Приложение, как правило, это набор классов, которые взаимодействуют друг с другом для реализации вариантов использования. - [Процедурное программирование](https://rupug.pro/lessons/procedural-programming/) - Процедурное программирование – это традиционная парадигма программирования, которая использовалась Progress Software с самого её основания. Предшественником языка ABL был язык Progress 4GL. В процедурном программировании вы создаёте и определяете «.p»-файлы, также известные как процедурные файлы. Эти файлы содержат распределённый по блокам ABL-код . Процедурное программирование играет важную роль в OERA-приложениях, так как процедуры обычно используются - [Парадигмы ABL-программирования](https://rupug.pro/lessons/abl-programming-paradigms/) - Язык ABL поддерживает две парадигмы программирования: Процедурная Объектно-ориентированная Обе парадигмы программирования могут быть использованы в ABL-приложении. Для лучшего решения конкретной задачи вы можете выбрать ту, которая подходит лучше всего. Вы также можете комбинировать их. - [Архитектура приложения](https://rupug.pro/lessons/application-architecture/) - При проектировании приложения необходимо определить, какие его части станут клиентскими процессами, а какие процессами серверными. Понимание действующих лиц в вариантах использования, поможет определить правильную архитектуру приложения. Например, если клиенты должны получать доступ к системе через веб-браузер или мобильное устройство, то это означает, что необходимо предоставить функциональные возможности клиентского приложения через Интернет, например, используя REST-адаптер. Если - [Приложение-пример](https://rupug.pro/lessons/example-application/) - Приложение-пример, используемое в этом пособии, называется Sports2000 и предназначено для компаний, реализующих спортивные товары. С помощью этого приложения спортивные товары могут быть заказаны покупателями самостоятельно посредством процесса автоматического заказа или через представителей службы по работе с клиентами, а также через торговых представителей. Sports2000 имеет функции для учёта хранимых товаров, доставки товаров клиентам и обработки клиентских - [Дополнительная литература](https://rupug.pro/lessons/additional-literature/) - Это руководство познакомило вас с базовыми концепциями и конструкциями языка программирования ABL для того, чтобы вы могли быстрее освоиться и приступить к написанию ABL-приложений. Более подробную информацию по возможностям ABL вы найдёте по следующим ссылкам: Введение в платформу OpenEdge для программистов Введение в Developer Studio for OpenEdge Программирование на OpenEdge ABL – Best Practices Использование - [Наборы данных](https://rupug.pro/lessons/prodataset/) - ProDataSet — это очень мощная конструкция, которая расширяет функциональные возможности временных таблиц. Объект ProDataSet в основном представляет собой набор из одной или нескольких временных таблиц-членов. Он также может содержать коллекцию отношений данных между таблицами-членами. К преимуществам использования ProDataSets относятся: Возможность группировать несколько временных таблиц в один объект набора данных. Возможность определить отношения между этими таблицами. - [Процедуры ABL](https://rupug.pro/lessons/abl-procedures/) - Файл процедуры ABL представляет собой текстовый файл с расширением .p , который содержит исходный код процедур приложения. Сам файл известен как внешняя процедура, но он может содержать в себе другие процедуры, называемые внутренними процедурами. В этом разделе содержится информация, относящаяся к процедурам ABL. Внешние и внутренние процедуры Выполнение процедуры Возврат значения из процедуры Использование параметров - [Работа с одномерными массивами](https://rupug.pro/lessons/working-with-one-dimensional-arrays/) - Массивы используются в ситуациях, когда вам нужно несколько значений для переменной. В ABL есть только одномерные массивы. В отличие от списка, который применяется только к данным CHARACTER, массив может быть определен для любого типа данных ABL. Чтобы определить массив, вы используете оператор VAR или оператор DEFINE VARIABLE . При желании вы можете указать размер (экстенты) - [Работа со списками](https://rupug.pro/lessons/working-with-lists/) - Списки, разделённые запятыми, используются для хранения нескольких элементов в одной символьной переменной. Например, вы можете хранить: Квоты продаж на 12 месяцев Названия отделов в вашей компании Названия 12 месяцев в году Определение списка Список — это строка с подстроками, каждая из которых разделена символом-разделителем. Запятая является разделителем по умолчанию. В следующем коде показаны два примера - [Работа с LONGCHAR](https://rupug.pro/lessons/working-with-longchar/) - Переменная LONGCHAR состоит из данных CHARACTER, но, в отличие от типа CHARACTER, размер этого типа не ограничен 32 КБ. Переменная LONGCHAR может быть больше, но она может быть ограничена доступной памятью. Вы можете использовать многие возможности обработки символов ABL со строками LONGCHAR. Тип данных LONGCHAR имеет связанные с ним метаданные для обозначения его кодовой страницы - [Работа с CHARACTER](https://rupug.pro/lessons/working-with-character/) - Когда вы определяете переменную как тип CHARACTER, её значением по умолчанию является пустая строка символов (""). Вы можете инициализировать переменную, чтобы установить начальное значение. В ABL вы можете изменить значение переменной CHARACTER при условии, что результат не превышает 32К символов. VAR CHAR cURLString. VAR CHAR cWarehouseName = "Bldg A". ABL предоставляет множество операторов и функций - [Работа с датами и временем](https://rupug.pro/lessons/working-with-dates-and-times/) - В приложении можно определить три типа данных, связанных с датой и временем: Тип данных ABL Описание DATE Значение, представляющее дату по григорианскому календарю. DATETIME Значение, состоящее из типа DATE и времени в миллисекундах, начиная с полуночи этой даты. DATETIME-TZ Значение, состоящее из типа DATETIME и смещения часового пояса от универсального скоординированного времени (UTC) в минутах. - [Базовый синтаксис ABL](https://rupug.pro/lessons/basic-abl-syntax/) - Код ABL хранится в файлах. Файлы могут быть файлами процедур, файлами классов или интерфейсов или включаемыми файлами, в зависимости от назначения. Код в файле состоит из операторов и блоков ABL. Блоки представляют собой группу связанных операторов ABL, которые обрабатываются как единое целое. Как и другие языки программирования, вы также можете добавлять комментарии к своему коду. - [Что такое ABL](https://rupug.pro/lessons/what-is-abl/) - Advanced Business Language (ABL) — это язык разработки, используемый в OpenEdge. Язык, обычно классифицируемый как язык программирования четвёртого поколения, использует синтаксис, подобный английскому, для упрощения разработки программного обеспечения, особенно в области баз данных и бизнес-логики. В отличие от других языков, ABL позволяет разработчикам управлять реляционными данными таким образом, который наилучшим образом соответствует потребностям их бизнеса, - [Временные таблицы](https://rupug.pro/lessons/temp-tables/) - Временная таблица (temp-table) — очень важная конструкция ABL, позволяющая определить набор данных. Временные таблицы представляют собой реляционные структуры, видимые для сессии OpenEdge, которая их создаёт, и существуют только в течение жизни этой сессии. Временные таблицы могут представлять данные из одной или нескольких таблиц в вашей базе данных или содержать разные данные. Случаи применения Есть два - [Изменение записей](https://rupug.pro/lessons/update-records/) - Чтобы добавить записи в базу данных, используется оператор CREATE, который помещает вновь созданную запись в базу данных. Всем полям в записи присваиваются начальные значения, указанные в схеме. Оператор CREATE вызывает выполнение триггера на создание, связанного с таблицей. Этот триггер может установить для полей в записи новые значения. Чтобы удалить записи из базы данных, используется оператор - [Запросы](https://rupug.pro/lessons/queries/) - Запрос (QUERY) определяет набор данных для извлечения из базы данных. Он обеспечивает ту же функциональность, что и блоки доступа к данным DO, FOR и REPEAT. Основное отличие состоит в том, что набор результатов, определённый запросом, не ограничивается блоком, в котором он определен. Используя дескриптор запроса, вы можете получить доступ к запросу и его набору результатов - [Доступ к данным](https://rupug.pro/lessons/data-access/) - В ABL есть четыре оператора, которые можно использовать для определения набора из одной или нескольких записей базы данных: FIND, FOR, REPEAT и OPEN QUERY. FIND извлекает одну запись при вызове оператора. FOR, REPEAT, и OPEN QUERY извлекают набор записей. После получения набора записей вы можете перебирать записи по одной. В этой части мы обсудим операторы - [Таблицы и буферы](https://rupug.pro/lessons/tables-and-buffers/) - Таблицы Таблица базы данных представляет собой набор логически связанных данных, рассматриваемых как единое целое. Таблицы содержат строки и столбцы. Все строки в таблице содержат один и тот же набор столбцов (полей). Таблицы часто имеют индексы. База данных OpenEdge следует реляционной модели, которая организует данные в таблицы. Отношения между таблицами определяются данными, то есть совпадающими значениями - [Блокировка записей](https://rupug.pro/lessons/locking-record/) - Когда вы читаете записи из таблицы базы данных, AVM применяет к записи уровень блокировки, которым вы можете управлять, чтобы предотвратить конфликты, когда несколько пользователей одних и тех же данных пытаются одновременно читать или изменять одни и те же записи. Эта блокировка не применяется к временным таблицам, поскольку они строго локальны для одной сессии ABL и - [Транзакции](https://rupug.pro/lessons/transactions-2/) - Транзакции обеспечивают целостность данных в базе данных. Далее вы узнаете о неявных и явных транзакциях и о том, как инструкция UNDO отменяет транзакцию. Неявные транзакции Во время транзакции информация обо всех действиях базы данных, происходящих во время этой транзакции, записывается в файл предварительного образа (Before-Image или BI), связанный с базой данных. Файл BI находится на - [Оператор RUN](https://rupug.pro/lessons/run-operator/) - После старта сессии AVM, вы можете запустить процедуру из другой процедуры ABL, используя оператор RUN . Если вы ещё не скомпилировали r-код для запускаемого вами исходного p-кода , AVM автоматически скомпилирует его и сохранит r-код в памяти. Однако после завершения сессии такой r-код будет удалён из памяти, и его нужно будет снова скомпилировать при следующем - [Параметр компилятора require-return-values](https://rupug.pro/lessons/compiler-parameter-require-return-values/) - Параметр компилятора require-return-values помогает разработчикам выявлять и исправлять проблемы, что приводит к созданию более надёжного кода. Параметр помогает гарантировать, что все пути логического кода имеют операторы RETURN value в определяемых пользователем функциях ABL, не-VOID-методах и получателях свойств. Операторы с отсутствующими RETURN value могут привести к неправильному поведению и коду, который трудно отлаживать. Включение этого параметра - [Оператор COMPILE](https://rupug.pro/lessons/compile-statement/) - Оператор COMPILE компилирует файл процедуры или файл определения класса в r-code. Компиляцию можно хранить в памяти во время работы сессии или сохранить навсегда для использования в последующих сессиях (в виде файла r-кода с расширением .r ). Когда вы компилируете файл определения класса, AVM по умолчанию компилирует файл определения класса, указанный в операторе компиляции, и все - [R-код и AVM](https://rupug.pro/lessons/r-code-and-avm/) - R-код является промежуточным языком, на который компилируется исходный код ABL. После преобразования ABL в r-code его можно запускать на разных платформах с помощью виртуальной машины ABL (ABL Virtual Machine, AVM). AVM — это среда, в которой выполняются приложения ABL. AVM имеет свой собственный список путей к каталогам, называемый PROPATH, для определения каталогов для поиска и - [Пользовательские функции](https://rupug.pro/lessons/user-defined-functions/) - Пользовательская функция — это блок пользовательского кода в файле процедуры, который возвращает значение. Это похоже на внутреннюю процедуру, но с требованием, чтобы она возвращала значение. Пользовательская функция также может определять параметры, которые используются как входные, выходные или и те, и другие. Прежде чем вы сможете использовать определяемую пользователем функцию в своём коде, вы должны определить - [Встроенные функции](https://rupug.pro/lessons/built-in-functions/) - ABL поддерживает длинный список встроенных функций, которые предоставляют разработчику на ABL лёгкий доступ к определенному набору возможностей. Каждая функция принимает чётко определенный список параметров и необязательно возвращает значение. Существует множество функций для работы со строками, числами, датами и временем и другими данными. Справочник по синтаксису ABL содержит справочные записи для каждой из этих функций. В - [Объекты на основе дескрипторов и классов](https://rupug.pro/lessons/handle-based-and-class-based-objects/) - ABL поддерживает две модели управления объектами, которые обеспечивают доступ к различным возможностям: Объекты на основе дескрипторов Объекты на основе классов Объекты на основе дескрипторов Объекты на основе дескрипторов представляют встроенные типы объектов в ABL, на которые вы ссылаетесь, используя дескрипторы объектов со слабой типизацией. Эти объекты обеспечивают доступ к различным возможностям ABL через их атрибуты - [Переносимость кода](https://rupug.pro/lessons/portability/) - Различные операционные системы имеют разные ограничения и соглашения об именах. Чтобы обеспечить переносимость между платформами, соблюдайте соглашения при именовании полей, файлов, таблиц и переменных. Ниже приведены некоторые рекомендуемые методы. Не используйте дефис в качестве первого символа имени файла и не используйте пробелы в именах файлов. Используйте строчные буквы при указании имени процедуры в операторе RUN - [Выражения и операторы](https://rupug.pro/lessons/expressions-and-operators/) - Выражения в ABL представляют собой комбинацию одного или нескольких терминов и операторов, результатом которых является одно значение определенного типа данных. Выражение может включать константы, имена переменных, имена полей базы данных или другие выражения. ABL имеет набор операторов для работы с числовыми, строковыми, логическими данными и датами. Тип данных должен быть совместим с оператором. Одним из - [Конструкция IF … THEN … ELSE](https://rupug.pro/lessons/if-then-else-statement/) - Оператор IF...THEN...ELSE используется для выполнения одного или нескольких операторов ABL на основе логического условия, которое оценивается как истинное. Синтаксис IF expression THEN { block | statement } [ ELSE { block | statement } ] Если значение условия, следующего за ключевым словом IF, истинно, то AVM выполняет оператор или операторы, следующие за ключевым словом THEN. - [Конструкция REPEAT](https://rupug.pro/lessons/repeat-statement/) - Оператор REPEAT начинает блок операторов ABL, которые многократно обрабатываются до тех пор, пока блок не закончится одним из нескольких возможных способов. Завершает блок оператор END. Блоки REPEAT могут быть явно завершены, когда выполняются условия времени выполнения. Хорошей практикой программирования является включение условия завершения для предотвращения бесконечных циклов. REPEAT-блоки также полезны для перебора записей. Синтаксис REPEAT - [Конструкция FOR](https://rupug.pro/lessons/for-statement/) - Оператор FOR похож на оператор DO, но предназначен специально для перебора записей. Оператор FOR запускает блок итерации, который считывает запись из одной или нескольких таблиц в начале каждой итерации блока. Завершает блок оператор END. Синтаксис FOR ... : /* ABL statements */ END. В следующем примере блок FOR EACH используется для перебора записей в таблице - [Конструкция DO](https://rupug.pro/lessons/do-statement/) - Оператор DO группирует операторы в единый блок. Завершает блок оператор END. Блок DO может быть простым не повторяющимся блоком, или может использоваться для итерации. Есть два способа управлять итерацией в DO-блоке: Повторение указанное количество раз. Повторение пока условие истинно. Повторение указанное количество раз Чтобы выполнить итерацию заданное количество раз, указываются начальное и конечное целочисленное значение - [Конструкция CASE](https://rupug.pro/lessons/case-statement/) - Оператор CASE обеспечивает ветвление, когда в зависимости от выполнения или невыполнения некоторого условия выполняется либо одна, либо другая последовательность действий. Вы можете указать несколько условий, каждое со своим собственным кодом, и выполнить код, когда условие истинно. Каждое условие определяется в разделе WHEN…THEN. Кроме того, вы можете определить раздел OTHERWISE для обработки любых условий, которые не - [Работа с дескрипторами](https://rupug.pro/lessons/working-with-handles/) - Тип данных HANDLE (дескриптор) хранит указатель на структуру, представляющую работающую встроенную процедуру ABL или объект в процедуре, например сокет, временную таблицу или кнопку. Дескрипторы позволяют получить доступ к атрибутам и методам, которые ABL определяет для каждого объекта, которые вы можете использовать для взаимодействия с состоянием и поведением объекта. Объекты на основе дескрипторов концептуально аналогичны объектам - [Работа с символьными строками](https://rupug.pro/lessons/working-with-character-strings/) - Приложение ABL может определять символьные данные с помощью переменной CHARACTER или LONGCHAR. Переменная CHARACTER может хранить значения в виде строк символов длиной до 32 КБ. Если вам нужно сохранить строку символов, длина которой превышает 32 КБ, используете тип данных LONGCHAR. Вы также можете использовать переменную LONGCHAR, если вам нужна строка символов в определенной кодовой странице, - [Работа с логическими данными](https://rupug.pro/lessons/working-with-logical-data/) - Логические данные представляют собой двоичное значение — YES (TRUE) или NO (FALSE). Вы используете логические значения и выражения во многих частях вашего приложения. Многие функции, методы и процедуры возвращают значения, сообщающие об успешном или неудачном выполнении. В коде ABL вы обычно проверяете возвращаемое значение, чтобы определить, как продолжить выполнение. Когда вы определяете логическую переменную, вы - [Работа с числовыми данными](https://rupug.pro/lessons/working-with-numeric-data/) - ABL предоставляет три типа числовых данных, которые вы можете использовать в своём приложении. Тип данных ABL Описание INTEGER или INT 32-битное целое число в диапазоне от -2147483648 до +2147483647. INT64 64-битное целое число в диапазоне от -9223372036854775808 до +9223372036854775807. DECIMAL Значение со знаком, содержащее не более 50 цифр, включая 10 цифр справа от десятичного знака. - [Переменные и типы данных](https://rupug.pro/lessons/variables-and-data-types/) - ABL позволяет определять программные переменные для использования в приложении. Переменная должна быть определена с определенным типом данных. Переменная может быть инициализирована значением при её определении или же ей может быть присвоено значение позже. Для определения переменных используется оператор VAR или оператор DEFINE VARIABLE. Оператор VAR— это более новая сокращённая запись оператора DEFINE VARIABLE. Большинство переменных - [Подключение к базе данных](https://rupug.pro/lessons/подключение-к-базе-данных/) - [Выполнение примеров](https://rupug.pro/lessons/выполнение-примеров/) - [Введение в REST](https://rupug.pro/lessons/rest-3/) - REST (Representational State Transfer) - это архитектурный стиль для распределённых вычислений, который работает в сочетании с протоколом передачи гипертекста (HTTP). REST использует HTTP для коммуникации и не связан с каким-либо конкретным форматом сообщения, поэтому вы можете выбрать, например, формат JavaScript Object Notation (JSON), который уменьшает объём отправляемых данных, что приводит к повышению производительности сети. При - [Итоги](https://rupug.pro/lessons/summary/) - Теперь, когда у вас появилось первоначальное представление о СУБД OpenEdge и серверах приложений PAS for OpenEdge и AppServer, а также их компонентах и инструментах управления, предлагаем для продолжения изучения следующий список учебных курсов: Основы администрирования СУБД OpenEdge Тюнинг баз данных OpenEdge Расширенное администрирование СУБД OpenEdge Управление и мониторинг баз данных OpenEdge Реализация табличного секционирования в - [Ядро и экземпляры PAS for OpenEdge](https://rupug.pro/lessons/pasoe-dba-3/) - Каталог $DLC\servers\pasoe представляет собой ядро PAS for OpenEdge. В ядро PAS for OpenEdge не допускается развёртывание приложений. Поэтому для развёртывания кода приложений необходимо создать отдельный экземпляр PAS for OpenEdge. Каждый экземпляр PAS for OpenEdge является независимой работающей копией ядра PAS for OpenEdge. Хотя каждый экземпляр представляет собой отдельный процесс, который выполняется в своей собственной Java - [Эффективный доступ к данным - рекомендации](https://rupug.pro/lessons/effective-data-access-recommendations/) - Следующие рекомендации предназначены, чтобы помочь Вам улучшить производительность запросов. Это только рекомендации, и при определенных обстоятельствах Вы можете игнорировать некоторые из них. В любом случае, следует обязательно проанализировать листинг перекрестных ссылок Xref и, при необходимости, реальное использование индексов по таблицам VST. Такой анализ еще более необходим, если проблема производительности реально существует при эксплуатации приложения. Дизайн - [Эффективный доступ к данным - индексы](https://rupug.pro/lessons/efficient-data-access-indexes/) - Использование индексов в OpenEdge обеспечивает: Ускорение доступа к записи; Автоматическое упорядочение записей при выводе; Контроль уникальности значений; Индексы могут быть составными - состоять из нескольких полей (компонент). Один из индексов таблицы определяется как первичный (Primary). Один или более индексов могут быть определены как уникальные (Unique). Можно определить индекс для поиска по словам внутри символьного поля - [Эффективный доступ к данным - запросы](https://rupug.pro/lessons/efficient-data-access-queries/) - Запросы ABL (ABL queries) – это операции управления данными, используемые для поиска или изменения данных, хранимых в БД. В языке ABL существуют следующие три типа запросов: FOR EACH / PRESELECT FOR EACH REPEAT PRESELECT DO PRESELECT FIND FIND [ FIRST | NEXT | LAST | PREV ] FIND FIND CURRENT FIND record WHERE ROWID (record) - [Эффективные конструкции языка - оператор IF](https://rupug.pro/lessons/effective-language-constructs-if-statement/) - Для начала – несколько замечаний по использованию, не связанных непосредственно с производительностью, но существенно влияющих на читаемость и сопровождаемость кода. Во-первых, следует иметь в виду, что проверяемое выражение может принимать неопределенное значение: DEF VAR bUnknown AS LOGICAL NO-UNDO. bUnknown = ?. IF bUnknown THEN DISPLAY 'yes'. ELSE IF NOT bUnknown THEN DISPLAY 'no'. ELSE DISPLAY - [Эффективные конструкции языка - оператор CASE](https://rupug.pro/lessons/an-effective-design-language-a-case-statement/) - Следует всегда использовать оператор CASE вместо серии вложенных операторов IF – это улучшает производительность (Программа 67): Программа 67. Оператор CASE DEFINE VARIABLE a AS INTEGER NO-UNDO. DEFINE VARIABLE i AS INTEGER NO-UNDO. a = 0. ETIME (TRUE). DO i = 1 TO 10000: IF a > 0 THEN DISPLAY '+'. ELSE IF a < 0 - [Эффективные конструкции языка - оператор ASSIGN](https://rupug.pro/lessons/effective-language-constructs-assign-operator/) - Обычно оптимизация кода приложения, не связанного с доступом к данным, дает меньший эффект с точки зрения производительности, чем оптимизация запросов к базе данных. Тем не менее, пренебрегать такой оптимизацией не следует. Рассмотренные далее конструкции языка, при всей их простоте, могут обеспечить значительное улучшение производительности приложения. Использование ASSIGN Оператор ASSIGN позволяет сгруппировать несколько идущих подряд операций - [Элементы и атрибуты XML](https://rupug.pro/lessons/prodataset-xml-elements-and-attributes/) - Элементы в XML-файле составляют древовидную структуру данных, а атрибуты содержат информацию об элементах. При использовании метода WRITE-XML по умолчанию выполняется сопоставление каждого поля временной таблицы с элементом XML. Однако также можно сопоставить поле с XML-атрибутом. Атрибут XML описывает характеристики или свойства элемента. Атрибуты обычно используются для указания того, как данные в элементе должны обрабатываться приложением. - [Экстенты](https://rupug.pro/lessons/area-extents/) - Экстент области хранения – это физический файл базы данных на диске. В областях хранения второго типа (Type II) каждый экстент содержит множество кластеров, о которых вы узнаете чуть позже. По умолчанию максимальный размер файла экстента может достигать размера 2 Гб. Но если вы используете файловую систему, которая поддерживает большие файлы, а иных в наше время - [Экстенты](https://rupug.pro/lessons/tune-8/) - Экстент – это элемент области хранения, который представлен в виде физического файла на дисковом устройстве. В областях хранения второго типа каждый экстент состоит из кластеров. Для задания размера, типа и места хранения экстентов используется структурный файл базы данных (.st). Использование экстентов позволяет: распределить файлы одной области хранения между несколькими дисками или файловыми системами и обеспечить - [Экспорт и импорт настроек](https://rupug.pro/lessons/pdsoe-19/) - При создании нового рабочего пространства можно указать что необходимо скопировать пользовательские виды и перспективы, но нельзя скопировать настроенные параметры рабочего пространства. Напомним, что ранее мы с вами настроили некоторые параметры рабочего пространства для этого тренинга и на их настройку ушло некоторое время. Настройки рабочего пространства включают такие параметры, как способ компиляции, использование регистра в коде - [ЭКЗАМЕН](https://rupug.pro/lessons/экзамен/) - [Что такое объект JSON?](https://rupug.pro/lessons/prodataset-what-is-json-object/) - Современные приложения обычно обмениваются данными, используя формат данных JSON. ОднакоJSON используется не только для обмена данными, но и для предоставления значений настроек для приложений. Объектами JSON можно обмениваться в виде текстовой строки, являющейся частью сообщения HTTP, или в виде файла. JSON – это стандартный формат для предоставления иерархических данных, где данные и их описания, например, - [Что такое набор данных?](https://rupug.pro/lessons/prodatasets-what-is/) - ProDataSet, далее «набор данных», представляет собой единый бизнес-объект в памяти, который состоит из временных таблиц. Набор данных также может определять отношения между этими таблицами. Изменения данных в наборе данных могут быть сохранены обратно в источник данных. Набор данных обеспечивает сопоставление между набором таблиц базы данных или другими источниками данных и их представлением в памяти. Раздельное - [Что такое OpenEdge?](https://rupug.pro/lessons/what-is-openedge/) - OpenEdge – это платформа разработки и размещения бизнес-приложений, которые могут быть развёрнуты как на собственном оборудовании, так и в Облаке. Платформа спроектирована так, чтобы обеспечить интеграцию ваших приложений с любыми другими не OpenEdge приложениями. Рассмотрим основные возможности платформы. Приложения OpenEdge написаны на собственном встроенном языке программирования, называемом Advanced Business Language (ABL). В недалёком прошлом язык - [Что такое OpenEdge Table Partitioning?](https://rupug.pro/lessons/what-is-openedge-table-partitioning/) - Табличное секционирование в OpenEdge (также известное как горизонтальное табличное секционирование) – это функция СУБД OpenEdge, которая позволяет администратору разделить записи очень большой таблицы на небольшие части, называемые секциями и в дальнейшем манипулировать ими индивидуально. Логически для приложения такая таблица по-прежнему представляется единым целым. Физически она размещена в нескольких частях (секциях) базы данных. Табличное секционирование интегрировано - [Что такое OERA?](https://rupug.pro/lessons/what-is-oera/) - OERA (OpenEdge Reference Architecture) – это концепция, определяющая основные функциональные категории компонент из которых в целом состоит приложение. Она используется в качестве основы для разработки сервис-ориентированных бизнес-приложений на OpenEdge. Каждый слой OERA состоит из отдельных компонент, которые имеют определённые особенности, роли и возможности. В OERA также описано как компоненты архитектуры взаимодействуют между собой. Целью OERA-дизайна - [Чтение данных JSON в набор данных](https://rupug.pro/lessons/prodataset-reading-from-json/) - При чтении данных из файла JSON можно указать, нужно ли добавлять и/или заменять данные в наборе данных. Для чтения данных JSON в набор данных следующие имена и типы в файле JSON должны совпадать с именами и типами в определении набора данных (схема): Имя набора данных. Имена временных таблиц. Имена полей. Типы полей. Типы полей ABL - [Часть 6. Экспорт и импорт параметров базы данных](https://rupug.pro/lessons/pdsoe-exercise-19/) - Как вы ранее обратили внимание, после импорта проекта в новое рабочее пространство, мы обнаружили связанные с отсутствием подключения к базе данных ошибки. При этом параметры подключения к базе данных не были скопированы вместе с настройками предыдущего рабочего пространства. Это сделано для безопасности. Так как другое рабочее пространство может принадлежать другим разработчикам, у которых параметры подключения - [Часть 5. Экспорт и импорт настроек](https://rupug.pro/lessons/pdsoe-exercise-18/) - В предыдущей части во время создания нового рабочего пространства мы указали опцию Copy Settings > Preferences. Благодаря этому настройки рабочего пространства были скопированы. Но что делать, если эта опция не была выбрана, или ваши настройки необходимо перенести в другое существующее ранее пространство? Далее вы переключитесь обратно в исходное рабочее пространство и экспортируете его настройки. Затем - [Часть 5. Выполнение кода ABL](https://rupug.pro/lessons/pdsoe-exercise-11/) - В завершение выполним ABL-код. Вы исполните процедуру SimpleClient.p, которая вызывает процедуры connect.p и FindFirstCustomerName.p. Двойным щелчком мыши откройте процедуру SimpleClient.p в каталоге src/Test проекта Client. Изучите код ABL в этом файле. Он использует оператор run для вызова процедуры connect.p, которая будет подключаться к базе данных, а затем использует оператор run для вызова процедуры GetFirstCustomerName.p, которая - [Часть 4. Сравнение файлов](https://rupug.pro/lessons/pdsoe-exercise-10/) - Теперь сравним два файла. В Project Explorer выберите файл GetFirstCustomerName.p в каталоге src проекта Server. Удерживая клавишу CTRL выберите файл GetLastCustomerName.p. Оба файла должны быть выделены. Щёлкните правой кнопкой мыши на выделенных файлах и выберите пункт меню Compare With > Each Other Откроется новое окно, в котором вы увидите соответствующее сравнение этих двух файлов. Закройте - [Часть 4. Создание нового рабочего пространства](https://rupug.pro/lessons/pdsoe-exercise-17/) - В этой части вы создадите новое рабочее пространство из текущего рабочего пространства, скопировав настроенные ранее представления. В проводнике Windows создайте новый каталог workspace2 рядом с каталогом текущего рабочего пространства. Создайте новое рабочее пространство, переключившись в каталог workspace2, который вы только что создали: Выберите File > Switch Workspace. Выберите Other. Щёлкните по кнопке Browse и выберите - [Часть 4. Настройка PROPATH для клиентского проекта](https://rupug.pro/lessons/pdsoe-exercise-6/) - Наш ABL-код в клиентском проекте ссылается на код серверного проекта, поэтому для успешного выполнения AVM должен иметь возможность найти этот код. В этой части мы изменим свойства клиентского проекта так, чтобы через PROPATH использовать каталог bin серверного проекта. В Project Explorer щёлкните правой кнопкой мыши по проекту Client и выберите пункт меню Properties. Перейдите в - [Часть 3. Старт сервера базы данных и настройка серверного проекта](https://rupug.pro/lessons/pdsoe-exercise-5/) - В той части упражнения мы выполним старт сервера базы данных sports2000 и настроим серверный проект Server для подключения к этой базе данных. Выполните старт командной строки Proenv, Start > Progress > OpenEdge > Proenv. Откроется новое окно командной строки, настроенное для работы в среде Progress OpenEdge. По умолчанию текущим рабочим каталог будет установлен рабочий каталог - [Часть 3. Создание представления Servers](https://rupug.pro/lessons/pdsoe-exercise-16/) - Здесь вы настроите рабочее пространство так, чтобы иметь возможность просматривать и управлять серверами приложений. Убедитесь в том, что сервис администрирования OpenEdge работает Откройте командную строку Proenv. Выполните команду: proadsv -query Если сервис стартован, то на экран будет выведено сообщение AdminServer is alive. Подтвердите учётные данные для доступа к сервису администрирования: Выберите Window > Preferences. Перейдите - [Часть 3. Поиск текста в рабочем пространстве](https://rupug.pro/lessons/pdsoe-exercise-9/) - В этой части вы попрактикуетесь в поиске текста в файлах вашего рабочего пространства или проекта. Щёлкните по иконке поиска В окне поиска введите Customer в поле Containing text. Щёлкните по кнопке Search. В нижней части экране рабочего пространства появится вкладка Search с результатом поиска, прокрутите вкладку для просмотра всех результатов. Вы можете разворачивать и сворачивать - [Часть 2. Удаление файлов и проектов](https://rupug.pro/lessons/pdsoe-exercise-15/) - Теперь, когда вы создали архив в качестве резервной копии рабочего пространства, вы можете попрактиковаться в удаление файлов и проектов. В Project Explorer щёлкните правой кнопкой мыши по файлу GetLastCustomerName.p из каталога src проекта Server и затем выберите пункт Delete. Подтвердите удаление файла из файловой системы. В Project Explorer щёлкните правой кнопкой мыши по проекту Client - [Часть 2. Создание нового проекта и импортирование файла](https://rupug.pro/lessons/pdsoe-exercise-4/) - Теперь создадим проект для клиентской части приложения-примера и импортируете в него файл. Параметры нового проекта: Название проекта, Client. Расположение файлов проектов, по умолчанию (каталог рабочего пространства). Каталоги для исходного и компилированного кода должны иметь названия src и bin. Перейдите в меню File > New. Обратите внимание, что в Developer Studio можно создать ряд ресурсов, которые - [Часть 2. Настройка параметров рабочего пространства](https://rupug.pro/lessons/pdsoe-exercise-2/) - Далее вы добавите некоторые настройки в рабочее пространство, которые будут действовать для всех проектов, которые будут созданы или добавлены в это рабочее пространство. В только что созданном рабочем пространстве выберите Window > Preferences. Выберите узел Progress OpenEdge на левой панели Измените настройки редактора следующим образом: В левой панели щёлкните по пункту Editor узла Progress OpenEdge. - [Часть 2. Копирование процедурного файла ABL и изменение кода ABL](https://rupug.pro/lessons/pdsoe-exercise-8/) - Теперь сделаем копию существующего файла из серверного проекта и изменим его. В Project Explorer щёлкните правой кнопкой мыши по файлу GetFirstCustomerName.p из каталога src проекта Server, и выберите пункт меню Copy. Затем щёлкните правой кнопкой мыши по каталогу src проекта Server и выберите пункт меню Paste. В окне конфликтов имён измените имя процедурного файла на - [Часть 1. Создание процедурного файла и добавление ABL-кода](https://rupug.pro/lessons/pdsoe-exercise-7/) - В той части упражнения вы создадите файл процедуры ABL, который будет вызван клиентской процедурой для подключения к базе данных, что позволит выполнить ABL-код на стороне сервера, который обращается к базе данных. Обычно серверный ABL-код выполняется на сервере приложений, который имеет подключение к базе данных, но в среде Developer Studio при выполнении кода необходимо явно подключиться - [Часть 1. Создание архива](https://rupug.pro/lessons/pdsoe-exercise-14/) - В этой части вы создадите архивный файл для клиентского и серверного проектов, с которыми вы работали. Убедитесь, что все файлы, которые вы хотите включить в архив, были сохранены. Выполните чистую сборку рабочего пространства: Выберите Project > Clean. Выберите OK. Выберите File > Export. Выберите General > Archive File. Щёлкните по кнопке Next. В окне Archive - [Часть 1. Первый запуск Developer Studio](https://rupug.pro/lessons/pdsoe-exercise-1/) - При первом запуске Developer Studio необходимо указать местоположение рабочего пространства для ваших проектов и задать параметры, которые будут использоваться проектами, содержащимися в рабочем пространстве. В этом упражнении вы создадите и настроите своё первое рабочее пространство в Developer Studio. Прежде всего скачайте архив pdsoe.zip и распакуйте его содержимое в любом удобном для вас месте. В примерах - [Часть 1. Импорт проекта OpenEdge](https://rupug.pro/lessons/pdsoe-exercise-3/) - Среди прилагаемых к этому тренингу файлов есть архив проекта с именем Server. Выполните следующие действия для его импорта в ваше рабочее пространство. В Developer Studio выберите пункт верхнего меню File> Import…. В открывшемся мастере импорта выберите General> Existing Projects into Workspace. Щёлкните Next. Выберите Select archive file. С помощью кнопки Browse найдите в файловой системе - [Цели урока](https://rupug.pro/lessons/prodataset-lesson-8-summary/) - Как разработчик OpenEdge, вы привыкли обращаться к данным в виде временных-таблиц, наборов данных ProDataSets и таблиц базы данных. Мы уже знаем, что в распределённой среде нам часто может потребоваться воспользоваться преимуществами приложений, которые не написаны на языке ABL. И, как правило, с такими приложениями обмен данными происходит с использованием стандартных форматов. На предыдущем уроке вы - [Цели урока](https://rupug.pro/lessons/prodataset-lesson-1-summary/) - Наборы данных ABL, называемые ProDataSet, расширяют возможности описания сложных бизнес-объектов с многочисленными уровнями данных и связями между ними. На этом уроке вы узнаете, что такое набор данных, как это работает и как наборы данных могут быть использованы для разработки сложных и гибких приложений. После завершения этого урока вы должны уметь: Описать набор данных. Перечислить преимущества - [Цели урока](https://rupug.pro/lessons/prodataset-lesson-2-summary/) - На этом уроке вы познакомитесь с некоторыми операторами языка ABL, который вы будете использовать для создания приложений OpenEdge работающих с наборами данных. Вы узнаете, как описать элементы набора данных, как связать временные таблицы набора данных с источниками данных (как правило, с таблицами базы данных). Далее научитесь заполнять набор данных и использовать различные параметры для контроля - [Цели урока](https://rupug.pro/lessons/prodataset-lesson-3-summary/) - Из прошлого урока вы узнали, как подготовить ABL-код для описания и заполнения набора данных. На этом уроке вы познакомитесь с использованием наборов данных в распределённой клиент-серверной архитектуре, когда клиентский код запрашивает набор данных с сервера приложений. Сначала вы узнаете о том, как передать набор данных с сервера к клиенту, а затем, научитесь писать клиентский код - [Цели урока](https://rupug.pro/lessons/rest-12/) - На этом уроке вы узнаете, как создать из существующего приложения Progress OpenEdge ABL приложение REST WEB. Сначала вы узнаете о том, как сделать аннотацию ABL-ресурсов и создать REST-сервис. Затем, как сопоставить REST-операции с операциями ABL. В заключение научитесь публиковать и тестировать REST-сервис в ваше среде разработки. Прежде чем приступить к этому занятию, необходимо выполнить следующие - [Цели урока](https://rupug.pro/lessons/prodataset-lesson-4-summary/) - Мы уже выяснили, как получать набор данных в клиент-серверном приложении. В этот раз разберёмся как обновлять полученный набор. Мы научимся обновлять данные на клиенте, подготовив набор данных для отправки изменённых данных на сервер с последующим вызовом серверной процедуры для обработки изменений. Разберёмся, как обработать изменения на сервере, применить их к базе данных и вернуть обновление - [Цели урока](https://rupug.pro/lessons/prodataset-lesson-7-summary/) - Вы уже знаете, как написать клиентский и серверный код на ABL с использованием ProDataSet для доступа к данным. Однако в распределённых средах ваше приложение скорее всего должно будет обмениваться данными с другими приложениям, которые написаны не на языке ABL. И на сегодня наиболее распространённым форматом обмена данными между такими приложениями является JavaScript Object Notation (JSON). - [Цели урока](https://rupug.pro/lessons/prodataset-lesson-6-summary/) - Программный код приложения должен быть написан так, чтобы он мог обнаруживать и обрабатывать ошибки. Объекты набора данных содержат атрибуты, которые позволяют обнаруживать и обрабатывать ошибки, связанные с набором данных. Эти ошибки встречаются на сервере и могут обнаруживаться и обрабатываться как на сервере, так и на клиенте. Ошибки могут возникать по ряду причин. Некоторые из них - [Цели урока](https://rupug.pro/lessons/rest-2/) - Прогресс OpenEdge позволяет сделать ваши OpenEdge-приложения доступными в качестве REST-сервисов для любого REST-клиента. REST-клиентом может быть: Клиент, созданный с помощью внешнего стороннего приложения. Приложение ABL, которое использует REST для связи между различными частями приложения. Мобильные приложения, которые вы можете создавать с помощью платформы Progress Telerik[1]. На этом уроке вы узнаете о REST (Representational State Transfer), - [Цели урока](https://rupug.pro/lessons/prodataset-lesson-5-summary/) - Для своего приложения вы можете написать код, который будет обрабатывать системные события, связанные с набором данных. Например, системное событие генерируется, когда создаётся запись во временной таблице. Вы можете использовать это событие для запуска специального обработчика, который, например, рассчитает начальные значения для заданных полей в записи временной таблицы или для изменения данных в связанной временной таблицы. - [Цели урока](https://rupug.pro/lessons/rest-26/) - Progress OpenEdge содержит библиотеки, которые упрощают доступ к сторонним REST-сервисам из клиента OpenEdge ABL. В этой части мы немного углубимся в понятия HTTP и REST с точки зрения доступа к REST-сервисам, а затем рассмотрим, как обеспечить такой доступ на языке ABL. - [Файлы базы данных](https://rupug.pro/lessons/database-files/) - Перед тем как приступить к изучению способов создания баз данных, рассмотрим какие файлы на уровне файловой системы ассоциированы с базой данных OpenEdge. База данных OpenEdge состоит из множества различных файлов, которые принадлежат отдельным её компонентам. На рисунке приведена схема файловой структуры, а назначение каждого её компонента описано далее. Файл описания структуры содержит информацию о структуре - [Форматирование реляционных данных в XML](https://rupug.pro/lessons/prodataset-formatting-relational-data-in-xml/) - Наборы данных ProDataSet могут содержать реляционные данные. Однако XML-документ – это неструктурированный файл. Поэтому AVM добавляет форматирование к XML-данным, чтобы сделать отношения между записями в связанных временных таблицах очевидными, простыми для просмотра и простыми для обработки приложением. Далее мы рассмотрим, как AVM форматирует XML-документ для представления связанных записей на примере отношения между таблицами Order и - [Файлы параметров](https://rupug.pro/lessons/parameter-file/) - Поскольку количество параметров старта базы данных может быть очень большим, то их ввод в командной строке или описание в строке скрипта старта может стать достаточно утомительным занятием, и, главное, сложно управляемым процессом. Поэтому распространена практика применения файлов параметров, использование которых поможет избежать ввода параметров в процессе старта базы данных и сложного управления ими в скриптах. - [Утилита PROBKUP](https://rupug.pro/lessons/utility-probkup/) - Встроенная в СУБД утилита командной строки probkup позволяет формировать резервную копию всех обязательных файлов базы данных в следующих режимах: Полное резервное копирование в онлайн. Полное резервное копирование в офлайн. Инкрементальное резервное копирование в онлайн. Инкрементальное резервное копирование в офлайн. Полное резервное копирование Упрощённый синтаксис утилиты probkup для полного резервного копирования базы данных следующий: probkup [online] - [Установка состояния ошибки с THROW](https://rupug.pro/lessons/set-the-status-of-the-errors-with-throw/) - Директива THROW использовалась во многих уже рассмотренных примерах. Рассмотрим некоторые дополнительные способы использования THROW: THROW с объектами ошибок THROW по умолчанию на уровне процедур THROW и пользовательские функции THROW с объектами ошибок Опция UNDO, THROW как часть фразы ON ERROR приводит к откату текущей транзакции, подавлению выдачи системного сообщения об ошибке, созданию и «заполнению» объекта - [Усечение секций](https://rupug.pro/lessons/partition-truncation/) - Случаи, когда вам может понадобиться усечение секции: Секция содержит устаревшие данные, вам необходимо выполнить их архивацию и освободить пространство, которое они использовали. Исходная композитная секции всё ещё содержит остаточные данные, и вы хотите удалить их. Вы хотите удалить секцию, но для этого прежде необходимо выполнить усечение и освободить занимаемые ею ресурсы. Когда вы только усекаете - [Установка состояния ERROR](https://rupug.pro/lessons/setting-the-state-to-error/) - Кроме уже рассмотренных способов программной установки состояния ERROR (опция RETURN ERROR во фразе ON ERROR и в операторе UNDO), это может быть сделано с помощью оператора RETURN. Оператор RETURN позволяет осуществить немедленный выход из блока. Немедленный - означает, что выполнение блока останавливается на операторе RETURN, и управление передается в вызывающий блок, без учета промежуточных блоков. - [Упражнение 7.5: Запись подмножества полей в JSON-файл](https://rupug.pro/lessons/prodataset-exercise-7-5/) - Задание 5 В этом задании мы запишем только часть полей из временной таблицы в файл JSON. Шаг Действие 1 Снова, в процедуре testJSON.p, добавьте комментарий к концу процедуры для нового тестового сценария. /*---------------------------------- Тестирование записи подмножества полей в файл JSON -------------------*/ 2 Добавьте код в конец процедуры чтобы указать, что следующие поля не должны быть - [Упражнение 7.4: Использование отличающихся имён](https://rupug.pro/lessons/prodataset-exercise-7-4/) - Задание 4 В этом задании мы укажем, что при записи данных в файл JSON должны использоваться разные имена. Затем проверим чтение данных из файла JSON, тем самым подтвердив, что мы можем это сделать успешно. Шаг Действие 1 Снова, в процедуре testJSON.p, добавьте комментарий к концу процедуры для нового тестового сценария. /*---------------------------------- Тестирование использования отличающихся имён - [Упражнение 7.3: Запись вложенных JSON-данных](https://rupug.pro/lessons/prodataset-exercise-7-3/) - Задание 3 В этом задании мы запишем набор данных как JSON, используя формат по умолчанию, и прочитаем их обратно в своё приложение. Затем укажем, что данные JSON должны быть записаны как вложенные. После чего прочитаем вложенные данные, чтобы подтвердить, что AVM может читать вложенные и не вложенные данные. Шаг Действие 1 Снова, в процедуре testJSON.p, - [Упражнение 7.2: Чтение JSON-данных](https://rupug.pro/lessons/prodataset-exercise-7-2/) - Задание 2 В этом задании мы заполним набор данных из файла JSON. Шаг Действие 1 Снова, в процедуре testJSON.p, добавьте комментарий к концу процедуры для нового тестового сценария для чтения файла JSON. /*---------------------------------- Тестирование чтения JSON в ProDataSet -------------------*/ 2 Добавьте код для чтения данных из PurchaseOrders_formatted.json в набор данных с предварительной очисткой набора данных. - [Упражнение 7.1: Запись данных в JSON](https://rupug.pro/lessons/prodataset-exercise-7-1/) - На этом практическом занятии вы напишите ABL-код для записи данных из набора данных в файл JSON, для чтения JSON-данных в набор данных, а также настроите способ записи данных JSON. Затем запишите вложенные данные и данные с разными именами и, наконец, запишите подмножество полей из временной таблицы в файл JSON. Это занятие состоит из пяти заданий, - [Упражнение 6.3: Установка и извлечение атрибута ERROR-STRING](https://rupug.pro/lessons/prodataset-exercise-6-3/) - Задание 3 В этой части вы измените процедуру обновления на сервере так, чтобы при возникновении ошибки в SAVE-ROW-CHANGES информация о неудачной строке добавлялась в ERROR-STRING для буфера before-таблицей. Для клиента вы напишете код для отправки изменений на сервер и, а после возвращения ответа с сервера получите ERROR-STRING. Шаг Действие 1 В процедуре update_dsPO_3 определите HANDLE-переменную - [Упражнение 6.2: Установка и получение атрибута REJECTED](https://rupug.pro/lessons/prodataset-exercise-6-2/) - Задание 2 В этом задании вы создадите процедуру update_dsPO_3 на сервере так, что если приложение обнаружит ошибку (application constraint), то SAVE-ROW-CHANGES не вызывается, но атрибут REJECTED устанавливается для строки, а атрибут ERROR устанавливается для временной таблицы и набора изменений. Затем вы добавите код в процедуру тестирования для изменения записи ttPurchaseOrder, которая нарушает ограничение приложения (application - [Упражнение 6.1: Обработка системных ошибок](https://rupug.pro/lessons/prodataset-exercise-6-1/) - На этом практическом занятии вы напишите код для обработки ошибок набора данных, возникающих при отправке обновлений на сервер. Сначала вы подготовите клиентский код для обработки атрибута ERROR, который автоматический устанавливается системой при неудачном вызове метода SAVE-ROW-CHANGES. Затем подготовите серверный код для установки атрибута REJECTED для строки и клиентский код для обработки отклонённой строки. В завершении - [Упражнение 5.7: Пакетирование на стороне клиента](https://rupug.pro/lessons/prodataset-exercise-5-7/) - Задание 7 В этом задании мы создадим клиентскую процедуру clientCust.p, которая будет извлекать пакеты данных с помощью серверной процедуры fetchCustomer.p. Эта процедура будет использовать внутреннюю процедуру GetMoreData как обработчик события OFF-END для состояния QUERY-OFF-END. После этого протестируем наш код. Шаг Действие 1 Создайте новый каталог с именем Batching в каталоге src проекта Client. 2 Создайте - [Упражнение 5.6: Пакетирование на стороне сервера](https://rupug.pro/lessons/prodataset-exercise-5-6/) - Задание 6 В этом задании мы подготовим описание набора данных и серверную процедуру для пакетного извлечения данных из таблицы Customer. Шаг Действие 1 В каталоге src/include проекта Shared создайте встраиваемый файл dsCustomer.i и добавьте в него код с описанием временной таблицы ttCustomer и набора данных dsCustomer. DEFINE TEMP-TABLE ttCustomer NO-UNDO BEFORE-TABLE bttCustomer FIELD CustNum - [Упражнение 5.5: Подготовка кода для тестирования обработчика события изменения](https://rupug.pro/lessons/prodataset-exercise-5-5/) - Задание 5 В этом задании мы добавим код во внешнюю процедуру access_dsPO_procs.p, с которой работали ранее. Мы загрузим процедуру с обработчиком событий в качестве персистентной и свяжем таблицу ttPOLine с обработчиков, созданным в предыдущем задании. Далее создадим тестовый сценарий, в котором получим с сервера набора данных, изменим некоторые записи ttPOLine и проверим, что обработчик событий - [Упражнение 5.4: Процедура обработки события изменения на клиенте](https://rupug.pro/lessons/prodataset-exercise-5-4/) - Задание 4 В этом задании необходимо создать внешнюю процедуру dsPO_ClientEventHandlers.p, которая будет содержать обработчик событий набора данных для клиентского кода. Этот обработчик будет сфокусирован на изменении в таблице ttPOLine, по следующему сценарию: товар с номером 33 больше не поставляется и должен быть заменён на товар с номером 50, который имеет туже цену. Когда запись ttPOLine - [Упражнение 5.3: Тестирование обработчика заполнения на сервере](https://rupug.pro/lessons/prodataset-exercise-5-3/) - Задание 3 Протестируем созданный обработчик событий добавив новый код в процедуру access_dsPO_procs.p, которую мы создали на прошлых практических занятиях. Шаг Действие 1 Откройте в OpenEdge Editor файл процедуры access_dsPO_procs.p. 2 Добавьте следующий комментарий в конец процедуры, перед блоком очистки. /*------------------------------------------------------ Практическое занятия 5.1 Тестирование события набора данных AFTER-FILL ------------------------------------------------------*/ 3 Очистите набора данных dsPO и - [Упражнение 5.2: Маппинг таблицы с обработчиком события заполнения](https://rupug.pro/lessons/prodataset-exercise-5-2/) - Задание 2 Теперь мы добавим в файл внешней процедуры dsPO_procs.p, который создали на прошлых занятиях, код для загрузки библиотеки процедур обработчиков событий и код связки набора данных с конкретным обработчиком. Шаг Действие 1 Откройте в OpenEdge Editor файл внешней процедуры dsPO_procs.p. 2 В начале этой процедуры добавьте описание переменной типа HANDLE с именем hdsEventHandlers: DEFINE - [Упражнение 5.1: Создание процедуры обработчика событий](https://rupug.pro/lessons/prodataset-exercise-5-1/) - На этом практическом занятии мы закрепим полученные знания написав код, который будет обрабатывать события заполнения набора данных на стороне сервера. Затем напишем клиентский код для обработки событий изменения. И в завершение реализуем пакетное извлечение данных, написав клиентский и серверный код. Занятие состоит из семи заданий на выполнение которых отводится примерно 60 минут. Задание 1 В - [УПРАЖНЕНИЕ 4: настройка перспектив](https://rupug.pro/lessons/pdsoe-exercise-12/) - В этом упражнении вы будете практиковаться в настройке перспектив Developer Studio. Переместите перспективу консоли в расположение рядом с Project Explorer. Для этого просто перетащите мышью перспективу в указанное место, как показано на скриншоте. Измените размер перспективы консоли, перетащив мышью её края. Откройте перспективу консоли в полноэкранном режиме, дважды щёлкнув по ней. Дважды щёлкните перспективу консоли, - [Упражнение 4.3: Тестирование клиентского и серверного кода](https://rupug.pro/lessons/prodataset-exercise-4-3/) - Задание 3 – Тестирование клиентского и серверного кода Выполним тестирование нашего кода, путём запуска программы access_dsPO_procs.p. Но прежде мы должны рестартовать экземпляр сервера приложений ProDataSets, чтобы его агенты могли использовать новый скомпилированные код приложения (перезагрузить в память r-code). Для этого: Во вкладке Servers выделите сервер ProDataSets. Щёлкните по иконке Run. Дождитесь пока статус сервера не - [Упражнение 4.2: Обработка изменений на сервере](https://rupug.pro/lessons/prodataset-exercise-4-2/) - Задание 2 – Код для обработки изменений на сервере В этом задании мы добавим новую внутреннюю процедуру во внешнюю процедуру dsPO_procs.p, которую мы создали на предыдущем практическом занятии. Эта новая процедура будет выполнять обновление базы данных на основе набора изменений и возвращать набор изменений назад клиенту. Шаг Действие 1 В OpenEdge Editor откройте процедуру dsPO_procs.p, - [Упражнение 4.1: Изменение набора данных на клиенте](https://rupug.pro/lessons/prodataset-exercise-4-1/) - На этом практическом занятии мы напишем клиентский и серверный код для реализации обновлений в наборе данных. Сначала мы подготовим код клиента: изменим данные в наборе данных, отправим изменения на сервер и выполним слияние изменений, полученных от сервера, в рабочий набор данных клиента. Затем подготовим серверный код: напишем процедуру обновления, которая применит изменения из полученного набора - [Упражнение 3.9: Получение набора данных с применением APPEND](https://rupug.pro/lessons/prodataset-exercise-3-9/) - Если необходимо добавлять данные в набор частями, то для этого можно использовать ключевое слово APPEND в операторе RUN. В этом задании мы очистим набор данных после предыдущих примеров, добавим код для получения данных с одним фильтром, а затем сделаем второй вызов процедуры с другим фильтром и ключевым словом APPEND. Шаг Действие 1 Очистите набор данных - [Упражнение 3.8: Добавление фильтров PurchaseOrder и POLine](https://rupug.pro/lessons/prodataset-exercise-3-8/) - Задание 5 – Добавления фильтров PurchaseOrder и POLine Шаг Действие 1 Очистите набор данных выполнив метод EMPTY-DATASET(). Следующий оператор следует добавить сразу после оператора закрытия файла OUTPUT CLOSE из предыдущего примера. DATASET dsPO:EMPTY-DATASET (). 2 Добавьте оператор вызова процедуры get_dsPO со строкой фильтра «PONum < 10000» в качестве первого входящего параметра и строкой «Price - [Упражнение 3.7: Добавление фильтра для таблицы PurchaseOrder](https://rupug.pro/lessons/prodataset-exercise-3-7/) - Задание 4 – Добавления фильтра для таблицы PurchaseOrder Теперь добавим в процедуру access_dsPO_procs.p ещё немного кода с использованием фильтра для таблицы PurchaseOrder в наборе данных. В первую очередь мы очистим набор данных, а новое содержимое набора сохраним в отдельный файл. Шаг Действие 1 Очистите набор данных выполнив метод EMPTY-DATASET(). Следующий оператор следует добавить сразу после - [Упражнение 3.6: Получение набора данных без фильтров](https://rupug.pro/lessons/prodataset-exercise-3-6/) - Задание 3 – Получения набора данных без фильтров Теперь в процедуру access_dsPO_procs.p добавим код для вызова внутренний процедуры get_dsPO без фильтров. Эта процедура должна вернуть все данные из таблиц PurchaseOrder и POLine из базы данных Sports2000. Извлечённые данные запишем в файл. Шаг Действие 1 Перед секцией отключения от сервера и очистки добавьте оператор вызова процедуры - [Упражнение 3.5: Подключение к серверу приложений](https://rupug.pro/lessons/prodataset-exercise-3-5/) - Задание 2 – Подключение к серверу приложений Далее мы создадим клиентскую процедуру с именем access_dsPO_procs.p, которая получает набор данных с сервера, вызывая внутреннюю процедуру get_dsPO из внешней библиотеки процедур dsPO_procs.p. Мы опишем набор данных, который должен быть таким же, как используется серверным кодом. Затем опишем хэндлы сервера и процедуры, используемые для доступа к серверу и - [Упражнение 3.4: Создание проекта для клиентского кода](https://rupug.pro/lessons/prodataset-exercise-3-4/) - После подключения сервера приложений к нашему рабочему пространству в Developer Studio мы готовы к написанию клиентского кода для вызова процедуры на стороне сервера и получения набора данных. Сначала мы создадим клиентский проект. Затем создадим ABL-процедуру и добавим в неё код, который выполняет подключение к экземпляру ProDataSets и запускает внешнюю процедуру на сервере. Далее напишем код - [Упражнение 3.3: Подготовка среды разработки для работы с сервером приложений](https://rupug.pro/lessons/prodataset-exercise-3-3/) - На этом практическом занятии мы подготовим среду разработки для работы с экземпляром сервера приложений PAS for OpenEdge. Мы проверим чтобы конфигурация запуска Developer Studio могла использоваться для старта сервера. Затем создадим экземпляр сервера приложений и добавим его в Developer Studio в представление Servers, чтобы могли его стартовать и останавливать. Далее изменим конфигурацию запуска для подключения - [Упражнение 3.2: Внутренняя процедура для извлечения данных](https://rupug.pro/lessons/prodataset-exercise-3-2/) - На предыдущих занятиях мы подготовили процедуру access_dsPO.p, которая заполняла набор данных, а затем записывала некоторое содержимое набора данных в файл. Теперь мы создадим новую внутреннюю процедуру с именем get_dsPO, которая принимает входящие параметры с условиями отбора данных для временных таблиц и возвращает набор данных в качестве OUTPUT-параметра. Шаг Действие 1 Добавьте в файл dsPO_procs.p после - [Упражнение 3.1: Передача набора данных клиенту](https://rupug.pro/lessons/prodataset-exercise-3-1/) - На этом занятии мы адаптируем код на стороне сервера, который мы написали на предыдущем уроке, чтобы использовать внешнюю процедуру с внутренней процедурой, которую клиент может вызвать для получения набора данных с сервера. Занятие состоит из двух заданий, на выполнение которых отводится примерно 15 минут. Весь код на стороне сервера для части заказа на поставку нашего - [Упражнение 3.10: Тестирование клиентского и серверного кода](https://rupug.pro/lessons/prodataset-exercise-3-10/) - Задание 7 – Тестирование клиентского и серверного кода Наконец, выполним созданный клиентский код, чтобы проверить его работу и работу серверного кода, который заполняет и возвращает набор данных. Предварительно убедитесь, что сервер приложений ProDataSets стартован. Выполните процедуру access_dsPO_procs.p: В Progress Explorer щёлкните правой кнопкой мыши по файлу access_dsPO_procs.p. Выберите пункт меню Run As -> Progress OpenEdge - [Упражнение 2.9: Применение FILL-WHERE-STRING](https://rupug.pro/lessons/prodataset-exercise-2-9/) - Продолжаем добавлять код, но теперь мы ограничим объем данных в наборе с помощью атрибута FILL-WHERE-STRING для таблицы POLine. В первую очередь очистим набор данных dsPO. Добавьте следующий оператор перед оператором RETURN. DATASET dsPO:EMPTY-DATASET(). Далее добавьте оператор OUTPUT для вывода содержимого набора данных в файл C:/mytemp/FillWhereStringDsPO.txt. Измените путь к файлу если необходимо. OUTPUT TO "C:\OpenEdge\WRK\ProDataSets\log\FillWhereStringDsPO.txt". Затем - [Упражнение 2.8: Частичное заполнение набора данных](https://rupug.pro/lessons/prodataset-exercise-2-8/) - В этом задании мы добавим код для частичного заполнения набора данных dsPO в ту же самую процедуру, на которой работали на прошлом задании. Мы также используем один и тот же набор данных, поэтому первое, что мы должны сделать, это очистить набор dsPO. Поэтому добавьте следующий оператор перед оператором RETURN. DATASET dsPO:EMPTY-DATASET(). Далее добавьте оператор OUTPUT - [Упражнение 2.7: Полное заполнение набора данных](https://rupug.pro/lessons/prodataset-exercise-2-7/) - На этом занятии вы продолжите доработку кода, который был создан ранее на этом уроке для заполнения набора данных с помощью подключённых источников данных. Вы измените код заполнения набора для некоторых данных таблицы PurchaseOrder. А в завершении с помощью FILL-WHERE-STRING для источника данных временной таблицы ttpoline измените условие извлечения данных из таблицы POLine. Занятие состоит из - [Упражнение 2.6: Подключение источника данных](https://rupug.pro/lessons/prodataset-exercise-2-6/) - Теперь вы подготовите код для подключения источников данных к буферам временных таблиц набора данных. Этот код должен быть добавлен в процедуру access_dsPO.p, которую вы подготовили на предыдущем практическом занятии этого урока. Шаг Действие 1 В секции Definitions процедуры access_dsPO.p добавьте оператор встраивания для включения описания источника данных, который был только что создан. Добавляемый код: {include/PO_DataSources.i} - [Упражнение 2.5: Описание источника данных](https://rupug.pro/lessons/prodataset-exercise-2-5/) - На этом практическом занятии вы, опираясь на то, что разработали ранее для доступа к набору данных dsPO из процедуры, опишите объекты источников данных, которые будут использоваться для заполнения набора данных, а также подключите эти источники к буферам временных таблиц набора данных dsPO. Занятие состоит из двух заданий, на выполнение которых отводится примерно 15 минут. Перед - [Упражнение 2.4: Создание процедуры для работы с набором данных](https://rupug.pro/lessons/prodataset-exercise-2-4/) - Теперь подготовим файл процедуры, которая будет использоваться для доступа к набору данных. В этом задании вы только добавите в процедуру встраиваемый файл с описанием набора данных, а на следующем практическом задании добавите в него код для заполнения набора данных. Шаг Действие 1 Используйте мастер New ABL Procedure для создания в папке src/AppServer проекта Server файла - [Упражнение 2.3: Создание файла для набора данных](https://rupug.pro/lessons/prodataset-exercise-2-3/) - Теперь создадим встраиваемый файл, который будет содержать описание набора данных для временных таблиц ttPurchaseOrder и ttPOLine, а также связей между ними. Шаг Действие 1 В Project Explorer добавьте в папку include проекта Shared новый встраиваемый файл dsPO.i: а. Щёлкните правой кнопкой мыши папку include проекта Shared. б. Выберите New -> ABL Include. в. В качестве - [Упражнение 2.2: Создание файлов для временных таблиц](https://rupug.pro/lessons/prodataset-exercise-2-2/) - Первый набор данных, который вы создадите, представляет данные в таблицах PurchaseOrder и POLine из базы данных. В этой части вы создадите встраиваемые файлы для временных таблиц ttPurchaseOrder и ttPOLine. Шаг Действие 1 Используя мастер «New Business Entity» создайте бизнес-сущность (Business Entity) в папке include проект Shared: а. Щёлкните правой кнопкой мыши папку include проекта Shared. - [Упражнение 2.1: Создание общего проекта](https://rupug.pro/lessons/prodataset-exercise-2-1/) - На этом практическом занятии вы создадите общий проект OpenEdge, которые будет содержать встраиваемые файлы используемые клиентской и серверной частями приложения. Затем создадите сами встраиваемые файлы для временных таблиц и набора данных, который их использует. Дополнительно создадите файл процедуры, которая использует созданный вами набор данных. Занятие состоит из четырёх заданий, на выполнение которых отводится примерно 15 - [Упражнение 1.4: Импорт проекта Examples](https://rupug.pro/lessons/prodataset-exercise-1-4/) - В этом учебном пособии вы будете использовать примеры программного кода, которые доступны для изучения и запуска из проекта Examples. Для этого необходимо импортировать этот проект в рабочую область и настроить его для подключения к серверу базы данных. Шаг Действие 1 В верхнему меню Developer Studio выберите пункт File -> Import. 2 В мастере импорта: а. - [Упражнение 1.3: Создание и настройка серверного проекта](https://rupug.pro/lessons/prodataset-exercise-1-3/) - Весь программный код серверной части приложения должен находиться в специальном серверном проекте. Назовём этот проект Server. Именно из этого проекта ABL-код будет получать доступ к базе данных. В этой части вы создадите и настроите серверный проект для использования базы данных sports2010. Шаг Действие 1 Выберите в верхнем меню Developer Studio пункт File -> New -> - [Упражнение 1.2: Настройка рабочей области Developer Studio](https://rupug.pro/lessons/prodataset-exercise-1-2/) - Теперь вы создадите новую рабочую область в Developer Studio, которая будет использоваться вами для ABL-разработки на практических занятиях из этого пособия. Шаг Действие 1 Откройте Developer Studio выбрав меню Start -> Progress -> OpenEdge -> Developer Studio. 2 Сначала вы можете увидеть экран приветствия, как показано здесь. Нажмите значок Workbench, чтобы перейти в рабочую область - [Упражнение 1.1: Старт сервера базы данных](https://rupug.pro/lessons/prodataset-exercise-1-1/) - В этом подготовительном упражнении вы настроите среду разработки для выполнения заданий из учебного пособия с использованием Progress Developer Studio for OpenEdge (далее Developer Studio). Упражнение состоит из четырёх частей, на выполнение которых отводится 30 минут. Используемая версия Progress OpenEdge должна быть 11.7 или выше. Перед тем как начать вы должны выполнить распаковку архива с файлами - [Управление экземпляром](https://rupug.pro/lessons/управление-экземпляром/) - Управлять экземпляром PAS for OpenEdge можно с помощью TCMAN или OpenEdge Explorer (Management). Управление экземпляром состоит из следующих задач: Старт экземпляра. Остановка экземпляра. Удаление экземпляра. Из оставшейся части этого урока вы узнаете, как выполнять эти задачи. Старт и остановка экземпляра с помощью TCMAN Чтобы стартовать экземпляр PAS for OpenEdge с помощью TCMAN, выполните следующую команду - [Управление серверами OpenEdge](https://rupug.pro/lessons/managing-openedge-servers/) - Как разработчик, вы должны уметь управлять OpenEdge- серверами в вашей среде разработки. Например, стартовать сервер базы данных или сервер приложений. В OpenEdge есть инструмент, позволяющий вам это делать, он называется OpenEdge Explorer. Кроме того, существует промышленная версия OpenEdge Explorer, которая называется OpenEdge Management, и которая имеет значительно больше возможностей для управления OpenEdge-средой. В рамках этого - [Управление механизмом AI File Management](https://rupug.pro/lessons/managing-the-ai-file-management/) - После включения автоматического режима архивации необходимо постоянно проводить мониторинг производительности механизма и состояния архивных каталогов. Утилита RFUTIL имеет необходимые классификаторы для изменения параметров AI File Management в online. Для изменения списка каталогов, используемых для архивации AI-экстентов, используется следующая команда, например, когда в текущих каталогах закончилось свободное пространство: rfutil db-name -C aiarchiver setdir new-path-dir1 Команда заменяет - [Указание деталей аутентификации](https://rupug.pro/lessons/rest-34/) - В зависимости от типа аутентификации, поддерживаемого сервером REST, вы можете использовать один из следующих методов класса RequestBuilder для указания учётных данных при создании запроса: UsingBasicAuthentication() UsingDigestAuthentication() UsingCredentials() AuthCallback( | ) Методы UsingBasicAuthentication () и UsingDigestAuthentication () обеспечивают полную упреждающую аутентификацию – учётные данные отправляются немедленно. С использованием методов UsingCredentials () и AuthCallback () учётные данные - [Удаление файлов и проектов](https://rupug.pro/lessons/pdsoe-16/) - Когда проект или файл больше не нужен, его можно удалить из рабочего пространства. Например, после того, когда вы импортировали какой-то проект, просмотрели его или скопировали из него какие-то файлы в другой проект рабочего пространства, и теперь он не нужен. Чтобы удалить проект или файл щёлкните по нему правой кнопкой мыши на панели Project Explorer и - [Удаление секций](https://rupug.pro/lessons/deleting-partitions/) - Если секция больше не нужна, то вы сначала должны выполнить её усечение и освобождение ресурсов, а затем удалить её. Примечание. Исходная композитная секция новой секционированной таблицы может быть усечена, занимаемые ей ресурсы могут быть освобождены, но она не может быть удалена. Существует два основных способа удаления секции: С помощью Database Administration Console. С помощью OpenEdge - [Удаление базы данных](https://rupug.pro/lessons/deleting-a-database/) - Удаление базы данных может понадобится в разных ситуациях, но в любом случае сделать это можно командой prodel. Перед тем как удалять базу данных, вы должны убедиться в том, что она остановлена и никем не используется. Когда база данных удаляется с помощью prodel, СУБД OpenEdge выводит на экран сообщение со списком удаляемых файлов и запрашивает подтверждение; - [Тюнинг таблицы локировок](https://rupug.pro/lessons/tune-34/) - Когда пользователи выполняют операции создания, чтения, изменения и удаления (CRUD) записей, они конкурируют за доступ к таблице локировок (Lock table). Чем больше выполняется параллельных CRUD-операций, тем выше конкуренция за локировки в таблице локировок и тем более низкая будет производительность. Параметр старта Lock Table Entries (-L) устанавливает максимально допустимое количество локированных записей в базе данных в - [Тюнинг спин-локировки](https://rupug.pro/lessons/tune-29/) - В многопроцессорной системе с лицензией OpenEdge Enterprise RDBMS необходимо выполнить настройку спин-локировки для улучшения ожиданий на задачах малой длительности. Для этого используется параметр Spin Lock Retries (-spin), с помощью которого определяется количество времени, в течение которого процесс должен пытаться получить «латч» (от англ. Latch) на локировку ресурса разделяемой памяти, прежде чем он сделает паузу. После - [Транзакции](https://rupug.pro/lessons/transactions/) - Транзакция – это законченная совокупность действий над БД, которая переводит ее из одного целостного состояния в другое. То есть транзакция представляет собой набор взаимосвязанных изменений базы данных, которые либо завершаются полностью, либо отменяются, не оставляя в базе данных никаких изменений. Используются также термины физическая транзакция и коммит юнит (commit unit). В самом общем случае, OpenEdge - [Традиционная обработка ошибок](https://rupug.pro/lessons/traditional-error-handling/) - ABL всегда был процедурным, блочно-структурированным языком, ориентированным на работу с базами данных. Язык позволяет смешивать логику процедурной обработки, пользовательского интерфейса и доступа к данным в одной процедуре. Ориентированность на работу с базами данных означает, что обработка ошибок в ABL превыше всего ставит защиту данных, работая в тесном взаимодействии с механизмом транзакций. Язык ABL был расширен, - [Типы табличного секционирования в OpenEdge](https://rupug.pro/lessons/the-types-of-table-partitioning-in-openedge/) - Напомним, что OpenEdge поддерживает секционирование на основе одного столбца и подсекционирование на основе нескольких столбцов. Что предпочесть в каждом конкретном случае зависит только от ваших технических и бизнес-требований. В OpenEdge существует два основных типа табличного секционирования: По диапазону (Range) По списку (List) Для подсекционирования вы можете использовать до 15 столбцов: Если вы собираетесь использовать подсекционирование - [Типы клиентов OpenEdge](https://rupug.pro/lessons/types-of-openedge-clients/) - Клиентские процессы OpenEdge взаимодействуют с серверными процессами, которые исполняют бизнес-логику и предоставляют бизнес-данные клиенту. Некоторые типы клиентских процессов работают внутри OpenEdge-приложения, другие используются для поддержки пользовательских интерфейсов, при этом они могут встраиваться друг в друга. В OpenEdge различаются следующие типы клиентских процессов: ABL client Open Client Web services client Mobile client WebSpeed client SQL client - [Типы данных. Что нужно помнить](https://rupug.pro/lessons/data-type-things-to-remember/) - Эта глава может показаться абсолютно тривиальной. В ней не описываются никакие «хитрые» или супер эффективные методы кодирования. Это – просто напоминание о некоторых базовых основах программирования на ABL. К сожалению, порой даже опытные разработчики испытывают определенные трудности с основами… Строки Размер данных типа CHARACTER ограничен 32 K (размер записи во временной таблице или БД также - [Тест](https://rupug.pro/lessons/тест/) - [Терминология OpenEdge Table Partitioning](https://rupug.pro/lessons/terminology-of-openedge-table-partitioning/) - Для реализации табличного секционирования в OpenEdge необходимо разобраться в следующих ключевых понятиях: Ключ секции (Partition key) Секционирование (Partitioning) Подсекционирование (Subpartitioning) Локальный индекс (Local index) Глобальный индекс (Global index) Политика секционирования (Partition policy) Детали политики секционирования (Partition policy detail) Отсечение секций (Partition pruning) Рассмотрим каждое из этих понятий. Ключ секции Ключ секции (Partition key) – это - [Текстовая загрузка данных](https://rupug.pro/lessons/load-data/) - После загрузки описания данных база готова к загрузке содержимого таблиц и значений секвенций. СУБД OpenEdge предоставляет несколько методов для загрузки этого содержимого. Выбор метода зависит от типа имеющихся файлов с выгрузкой. Следующая таблица содержит список различных типов файлов выгрузки и используемых методов для их загрузки в базу данных. Тип файла Метод загрузки Файлы с текстовой - [Старт фоновых процессов](https://rupug.pro/lessons/start-background-processes/) - Вы уже знаете, что фоновые процессы (background process) призваны повысить производительность базы данных, забирая на себя большую часть нагрузки с брокера базы данных обрабатывая её в фоновом режиме. Есть четыре типа фоновых процессов: Before-Image Writer (BIW). After-Image Writer (AIW). Asynchronous Page Writers (APWs). Watchdog (PROWDOG). Все эти процессы считаются процессами, подключёнными к базе данных и - [Старт сессии базы данных в многопользовательской среде](https://rupug.pro/lessons/start-a-database-session-in-a-multi-user-environment/) - После старта брокера база данных готова к работе с множеством одновременных пользовательских подключений. В многопользовательской среде клиенты могут взаимодействовать с базой данных посредством: многопользовательской интерактивной сессии, которая позволяет пользователям взаимодействовать с базой данных; многопользовательской пакетной сессии, которая выполняет набор команд в запланированное время и не предусматривает какое-либо взаимодействие с пользователем. Как администратор базы данных, вы - [Старт процесса Watchdog](https://rupug.pro/lessons/tune-27/) - Во время работы базы данных могут возникать ситуации, когда сессии базы данных завершаются ненадлежащим образом, оставляя после себя «мёртвые» процессы. Такие процессы не только могут занимать ценные системные ресурсы, но и приводить к снижению производительности базы данных. Чтобы исключить эту потенциальную проблему, администратор должен стартовать процесс watchdog. Процесс watchdog – это фоновый процесс, который проверяет - [Старт процесса Before-Image Writer](https://rupug.pro/lessons/tune-24/) - Процесс Before-Image Writer (BIW) – это фоновый процесс, который непрерывно записывает изменённые BI-буферы на диск. Процесс BIW повышает производительность базы данных за счёт того, что он стабильно обеспечивает базу данных пустыми BI-буферами, тем самым освобождая СУБД от необходимости выполнять эту работу. В качестве хорошей практики, после старта базы данных должен быть стартован процесс BIW. Команда - [Старт процесса After-Image Writer](https://rupug.pro/lessons/tune-25/) - Процесс After-Image Writer (AIW) – это фоновый процесс, который непрерывно записывает AI-буферы на диск. Процесс AIW повышает производительность базы данных за счёт того, что он стабильно обеспечивает её пустыми AI-буферами, тем самым освобождая СУБД от необходимости выполнять эту работу. В качестве хорошей практики, если активирован механизм After-Imaging, после старта базы данных должен быть стартован процесс - [Старт и останов с помощью OpenEdge Management](https://rupug.pro/lessons/start-and-stop-with-openedge-management/) - Вы уже знаете, как стартовать базу данных в многопользовательской среде с помощью Proenv. Но кроме Proenv существует другой способ управления базой данных – это инструмент под названием OpenEdge Management. OpenEdge Management представляет собой веб-консоль, откуда вы можете управлять ресурсами OpenEdge. С её помощью можно также выполнять мониторинг ресурсов, просматривать статистику в виде графиков, а также - [Старт и останов в однопользовательской среде](https://rupug.pro/lessons/start-and-stop-in-a-single-user-environment/) - Вы уже знаете, как стартовать сессии базы данных в многопользовательской среде для выполнения административных задач в то время, когда другие пользователи работают с базой данных. Но бывают ситуации, когда необходим полный контроль над базой данных для выполнения административной работы, требующей эксклюзивного доступа. Такого рода работы можно выполнить с помощью старта базы данных в однопользовательской среде. - [Старт в многопользовательском режиме в Proenv](https://rupug.pro/lessons/start-in-multiuser-mode-in-proenv/) - Для старта базы данных в многопользовательском режиме необходимо стартовать брокера. После старта брокера клиенты cмогут выполнять подключения к базе данных. Вы можете выполнить одну или несколько задач для старта базы данных в многопользовательской среде: Стартовать одного или нескольких брокеров базы данных. Создать и вызвать файл параметров для автоматизации задач старта брокеров. Стартовать фоновые процессы. Далее - [Старт Asynchronous Page Writers](https://rupug.pro/lessons/tune-26/) - Процесс Asynchronous Page Writer (APW) – это фоновый процесс, который непрерывно записывает не заблокированные изменённые буферы базы данных из памяти на диск. Процесс APW улучшает производительность базы данных за счёт того, что: обеспечивает постоянный приток пустых доступных буферов базы данных, чтобы СУБД могла использовать их по мере необходимости; сокращает количество буферов базы данных, которые СУБД - [Стандарт разработки COINS Ltd](https://rupug.pro/lessons/coins-ltd-development-standard/) - Разработка этого стандарта была начата в 2001 году, одновременно с принятием решения о конверсии традиционного терминального приложения в распределенную архитектуру с использованием web-интерфейса как основного пользовательского интерфейса. При разработке стандарта использовался рассмотренный ранее стандарт от Fast 4GL Systems, так, раздел «Дизайн базы данных. Общие положения» включен практически дословно. Стандарт активно развивался и в настоящее время - [Среды с одной или несколькими базами данных](https://rupug.pro/lessons/environments-with-one-or-more-databases/) - Каждая база данных СУБД OpenEdge может работать либо самостоятельно (single-database environment), либо в составе нескольких баз данных (multi-database environment) что предоставляет больше гибкости в создании и управлении бизнес-данными. В среде с одной базой данных пользователю необходимо получить доступ только к одной базе данных за один раз. В такой среде одна база данных содержит все структуры - [Средства мониторинга производительности](https://rupug.pro/lessons/performance-monitoring-tools/) - Администраторы баз данных OpenEdge обычно используют для мониторинга и анализа производительности виртуальные системные таблицы (VST) и утилиту PROMON, а также ряд других методов и средств, предназначенных для оценки производительности системы в целом. Рассмотрение этих методов и средств выходит за рамки данного курса. Следует лишь иметь в виду, что они позволяют выявить и устранить все узкие - [Среда разработки приложений OpenEdge](https://rupug.pro/lessons/openedge-application-development-environment/) - Основой среды разработки OpenEdge является язык программирования ABL (Advanced Business Language), ранее известный как PROGRESS 4GL. Язык ABL является языком четвертого поколения (4GL) и представляет собой чрезвычайно мощный и гибкий инструмент для разработки бизнес-приложений. Основными особенностями языка ABL являются: Универсальность. Язык содержит синтаксические средства, позволяющие кодировать: Интерфейс пользователя Бизнес-логику Извлечение данных Управление данными Управление транзакциями - [Сравнение файлов](https://rupug.pro/lessons/pdsoe-10/) - По мере добавления большего количества кода в приложения, могут появиться файлы, которые будут похожи и являться разными версиями одного кода, которые вам необходимо сравнить на предмет различий. Следующие шаги описывают действия для сравнения двух файлов в Developer Studio. Вы попрактикуетесь в сравнении файлов во время выполнения заданий третьего упражнения. В Project Explorer выделите первый файл, - [Сравнение строк: OR, LOOKUP, CAN-DO, INDEX](https://rupug.pro/lessons/string-comparison-or-lookup-can-do-index/) - Рассмотрим сравнение строк на примере (Программа 68), где требуется проверить, принимает ли переменная одно из заданных значений. Это может быть сделано с помощью оператора OR или встроенных функций LOOKUP, CAN-DO или INDEX. Программа 68. Сравнение строк DEFINE VARIABLE cProjStatus AS CHARACTER NO-UNDO. cProjStatus = ‘L’. IF cProjStatus = 'L' OR cProjStatus = 'T' OR cProjStatus - [Справка по синтаксису ABL](https://rupug.pro/lessons/pdsoe-07/) - По мере ввода ABL-кода можно получить помощь по синтаксису несколькими способами. Вы можете посмотреть полную справку с возможностью поиска, или контекстную справку по определённому ключевому слову. Посмотреть контекстную справку по определенному ключевому слову можно наведя на него курсор мыши в окне редактора. Кроме того, когда вы вводите ABL-код в окне редактора, редактор выводит подсказки, особенно - [Способы мониторинга PASOE](https://rupug.pro/lessons/pasoe-dba-34/) - Как уже было сказано, существует несколько способов мониторинга среды сервера приложения PAS for OpenEdge. Основные из них представлены в следующей таблице: Инструмент Описание REST API OpenEdge имеет специальный REST API, который можно использовать не только для просмотра состояния среды PAS for OpenEdge, но и для выполнения соответствующих действий на основе полученных результатов. Для того, чтобы - [Сохранение и компиляция кода](https://rupug.pro/lessons/pdsoe-09/) - Всякий раз, когда вы нажимаете значок сохранить, чтобы сохранить один или несколько файлов в рабочем пространстве, Developer Studio повторно компилирует вновь сохранённые файлы, если вы указали Compile on Save в настройках рабочего пространства. После сохранения файла необходимо проверить наличие ошибок компилятора в представлении Problems. Двойной щелчок по ошибке выполнит переход к местоположению ошибки в файле. - [Сопоставление параметров](https://rupug.pro/lessons/rest-17/) - Последний шаг в связывании REST- и ABL-операций – это сопоставление параметров. Методы REST-ресурсов содержат два разных типа сопоставления параметров: Сопоставление запросов Сопоставление ответов Для каждого REST-метода необходимо сопоставить секции REST-запросов c входными ABL-параметрами и секции REST-ответов c выходными ABL-параметрами. В REST-сервисе можно сопоставить параметры интерфейса с любыми секциями, присутствующими в HTTP-запросе или ответе, такими как: - [Сопоставление REST-операций с ABL-операциями](https://rupug.pro/lessons/rest-16/) - После создания REST-сервиса с помощью мастера создания интерфейса сервиса необходимо сопоставить REST-операции с ABL-операциями, для этого необходимо: Добавить REST-ресурсы к созданному REST-сервису. Для каждого ресурса сопоставить REST(HTTP) метод с операциями аннотированных ABL-классов (.cls) и/или процедурных файлов (.p). Для каждого REST-метода сопоставить параметры HTTP-запросов и ответов с параметрами интерфейса. Далее вы узнаете, как выполнить эти три - [Создание экземпляра и назначение его сборщиком метрик](https://rupug.pro/lessons/pasoe-dba-31/) - При необходимости можно настроить сборщик метрик, если требуется отслеживать состояние среды выполнения рабочих экземпляров. Способ создания экземпляра и назначения его сборщиком метрик аналогичен способу создания и назначения экземпляра балансировщиком нагрузки. Единственная разница заключается в том, что вы должны назвать сборщика метрик status. - [Создание экземпляра и назначение его балансировщиком нагрузки](https://rupug.pro/lessons/pasoe-dba-30/) - Чтобы назначить экземпляр в качестве балансировщика нагрузки, необходимо указать имя экземпляра lb. Кроме того, необходимо убедиться, что на этом экземпляре не развёрнуты приложения ABL. Напомним, что по умолчанию приложение ABL разворачивается в каталоге ROOT с каждым экземпляром PAS for OpenEdge. Вы должны отменить публикацию приложения ABL по умолчанию. Сделать это можно двумя способами: с помощью - [Создание экземпляра](https://rupug.pro/lessons/pasoe-dba-21/) - При инсталляции производственной версии PAS for OpenEdge (требуется специальная лицензия) не создаётся экземпляр PASOE по умолчанию. Кроме того, в производственной среде при создании экземпляра: Все транспорты (APSV, REST, SOAP, WEB) деактивированы по умолчанию. Менеджеры приложений (Tomcat и OpenEdge) не устанавливаются. Перед развёртыванием приложения в производственной среде после создания экземпляра PAS for OpenEdge необходимо активировать соответствующие - [Создание целевой базы для загрузки данных](https://rupug.pro/lessons/create-target-database/) - После завершения выгрузки пришло время, используя полученные знания и опыт, создать целевую базу для загрузки данных. Это хороший момент, когда предоставляется возможность для: Устранения проблем, выявленных при администрировании исходной базы данных. Например, слишком маленькие размеры экстентов с данными, слишком маленькие AI- и BI-экстенты, неправильное количество записей в блоке или маленькое количество блоков в кластере. Изменения - [Создание файла параметров](https://rupug.pro/lessons/tune-22/) - Файл параметров – это текстовый файл, в котором каждая строка представляет собой параметр старта, состоящий из имени параметра и, если требуется, значения параметра. Для создания файла параметров может быть использован любой текстовый редактор, с помощью которого файл заполняется всеми необходимыми параметрами и сохраняется с расширением «.pf». В качестве альтернативного решения файл параметров можно создать и - [Создание сервера приложений с помощью TCMAN CREATE](https://rupug.pro/lessons/pasoe-dba-4/) - В среде разработки вы можете использовать экземпляр сервера приложений по умолчанию oepas1 или создать собственный для развёртывания вашего приложения. В платформе OpenEdge существует два варианта создания экземпляра PAS for OpenEdge: с помощью утилиты командной строки TCMAN; с помощью OpenEdge Explorer. Утилита командной строки TCMAN – это интерфейс, который реализует административные функции, предоставляемые основными скриптами Tomcat. - [Создание сервера приложений в OpenEdge Explorer](https://rupug.pro/lessons/pasoe-dba-5/) - Как и TCMAN, OpenEdge Explorer можно использовать только для создания локального экземпляра PAS for OpenEdge. Однако, если вы создали экземпляр на другой машине, отличающейся от той, где находится ваш OpenEdge Explorer, то в OpenEdge Explorer его можно добавить в качестве удалённого экземпляра. Для того чтобы создать локальный экземпляр PAS for OpenEdge с помощью OpenEdge Explorer - [Создание секционных таблиц, политик и деталей с помощью OpenEdge SQL](https://rupug.pro/lessons/creating-policies-and-details-using-the-oe-sql/) - Если вы предпочитаете использовать OpenEdge SQL, то вы можете использовать операторы SQL для работы с секционированием. Далее мы рассмотрим, как с помощью OpenEdge SQL можно реализовать четыре типа табличного секционирования: Секционирование по диапазону Секционирование по списку Подсекционирование типа List-Range Подсекционирование типа List-List Также вы узнаете, как используя OpenEdge SQL можно создавать секционно-ориентированные локальные индексы. Секционирование - [Создание процедурного файла ABL](https://rupug.pro/lessons/pdsoe-06/) - Редактор OpenEdge используется для разработки и тестирования ABL-кода. Далее вы научитесь: создать процедурный файл ABL; редактировать код; выполнять поиск в рабочем пространстве; сохранять и компилировать код; сравнивать файлы; исполнять ABL-код. В Developer Studio есть мастера, позволяющие создавать файлы разных типов в папке проекта. Действия для создания файлы ABL-процедуры. Вы попрактикуетесь в создании ABL-процедуры во время - [Создание проекта в Developer Studio](https://rupug.pro/lessons/creating-a-project-in-developer-studioсоздание-проекта-в-developer-studio/) - Проекты OpenEdge могут создаваться как для всего приложения, так и для отдельных его частей. Хорошей практикой считается разделять приложение на несколько проектов, которые исполняют различные процессы. У вас может быть проект, который работает на сервере приложений, и проект, в котором реализован ABL-клиент. Проект может быть включён в рабочее пространство или быть с ним связан. Он - [Создание приложения REST WEB](https://rupug.pro/lessons/rest-14/) - Developer Studio предлагает несколько способов создания REST-приложений. На этом тренинге мы рассмотрим, как создать такое приложение из существующего ABL-приложения. Информацию о других способах вы найдёте в руководстве “Progress OpenEdge Development: Web Services”. Ниже приведены высокоуровневые задачи, которые необходимо выполнить для создания REST WEB приложения из существующего приложения ABL: Выполнить аннотацию ABL-ресурсов для создания REST-сервиса. Настроить - [Создание политик секционирования и деталей с помощью ABL API](https://rupug.pro/lessons/creating-policies-and-details-using-the-abl-api/) - Процесс секционирования может быть автоматизирован при помощи ABL API for Table Partition Management. ABL API for Table Partition Management – это набор пользовательских ABL-классов и интерфейсов, которые позволяют получать доступ и обновлять схему базы данных. Чтобы упростить вам задачу, OpenEdge позволяет использовать программу генерации политики секционирования как шаблон, который вы можете модифицировать для своих нужд. - [Создание политик секционирования и деталей в Database Administration Console](https://rupug.pro/lessons/creating-a-partition-policy-and-details-in-the-database-administration-console/) - Вы научились создавать новые секционированные таблицы в Data Dictionary. Следующим шагом вы научитесь создавать политики секционирования и детали политики секционирования для секционированной таблицы. Сделать это можно двумя способами: С помощью Database Administration Console С помощью ABL API for Table Partitioning Management Сначала рассмотрим создание политики в Database Administration Console Создание политик секционирования Для создания политик - [Создание новых секционированных таблиц в Data Dictionary](https://rupug.pro/lessons/create-new-partitioned-tables-in-data-dictionary/) - Для того чтобы создать новую секционированную таблицу с помощью Data Dictionary необходимо: Создать таблицу Добавить в таблицу необходимые поля Создать индексы Процесс создания секционированной таблицы аналогичен процессу создания обычной таблицы, за исключением того, что вам необходимо установить галочку в поле Partitioned, т.е. указать, что таблица будет секционируемой. При этом если функция Table Partitioning будет неактивна - [Создание клиента HTTP](https://rupug.pro/lessons/rest-30/) - Чтобы создать HTTP-клиент, необходимо создать экземпляр OpenEdge.Net.HTTP.IHttpClient, используя метод Build () и свойство Client класса ClientBuilder. В первую очередь следует описать переменную с типом OpenEdge.Net.HTTP.IHttpClient: define variable as OpenEdge.Net.HTTP.IHttpClient no-undo. Затем создать экземпляр класса с присвоением этой переменной: = ClientBuilder:Build():Client. Здесь, ClientBuilder – это класс, который содержит методы для создания клиента; Build () - [Создание и публикация файла worker.properties](https://rupug.pro/lessons/pasoe-dba-32/) - Файл worker.properties определяет экземпляр балансировщика нагрузки, экземпляр сбора метрик и рабочие экземпляры, выполняющие клиентские запросы. Для создания и публикации файла необходимо выполнить следующие действия: Создать предварительный файл worker.properties путём выполнения команды tcman workers в каталоге bin каждого экземпляра, включая экземпляр балансировщика нагрузки, экземпляр сбора метрик и все рабочие экземпляры. Поскольку в идеале экземпляры работают на - [Создание и переключение рабочих пространств](https://rupug.pro/lessons/pdsoe-18/) - Во время разработки вам может понадобиться работать с другим рабочим пространством, которое представляет собой другую версию вашего приложения или совершенного другого приложения. Для переключения на другое рабочее пространство необходимо выполнить следующее: Выбрать пункт меню File > Switch Workspace …. Выбрать необходимое рабочее пространство. DeveloperStudio выполнит рестарт используя параметры нового рабочего пространства. В некоторых случаях может - [Создание и открытие рабочего пространства](https://rupug.pro/lessons/pdsoe-02/) - При запуске Developer Studio будет предложено выбрать рабочее пространство. Рабочее пространство — это место в файловой системе, куда помещаются все файлы, связанные с разрабатываемым приложением. В рабочем пространстве создаются или импортируются в него проекты, которые содержат программный код либо всего приложения, либо отдельных его модулей. При первом открытии нового рабочего пространства появится страница приветствия, на - [Создание запроса](https://rupug.pro/lessons/rest-32/) - После создания URI вы должны использовать его как часть HTTP-запроса. Для создания запроса применятся метод Build () и свойство Request класса RequestBuilder. define variable as OpenEdge.Net.HTTP.IHttpRequest no-undo. = RequestBuilder:Build(,):Request. Класс RequestBuilder также предоставляет другие методы, которые позволяют определять ожидаемый формат тела ответа, добавлять заголовки, использовать аутентификацию, использовать прокси и указывать другие параметры. Некоторые - [Создание дополнительных ABL-приложений в PASOE](https://rupug.pro/lessons/pasoe-dba-10/) - В вашем экземпляре PAS for OpenEdge может быть несколько ABL-приложений в зависимости от бизнес-требований. Каждое ABL-приложение будет иметь своё собственное подключение к базе данных и настройки безопасности. Например, вы можете отделить приложение для отдела кадров от приложения, которое управляет вашим бизнесом, каждое со своей собственной базой данных и настройками безопасности. Другой пример, это возможность объединить - [Создание базы данных](https://rupug.pro/lessons/tune-11/) - Когда определены количество и типы областей хранения, количество и размеры экстентов, количество блоков базы данных в кластере и наилучшее количество записей в блоке для каждой области, можно приступить к созданию базы данных. Для создания базы данных в первую очередь создаётся и заполняется соответствующими параметрами структурный файл базы данных. Затем этот файл проверяется на соответствие синтаксису - [Создание архива проекта](https://rupug.pro/lessons/pdsoe-15/) - Для того чтобы иметь возможность обмениваться кодом с другими разработчиками, а также чтобы создавать резервные копии своей работы, вы можете создать архив, содержащий один или несколько проектов из вашего рабочего пространства. Далее приведены шаги по созданию архивного файла для проекта. Вы попрактикуете эти действия во время следующего упражнения. Убедитесь в том, что все файлы, которые - [Создание URI](https://rupug.pro/lessons/rest-31/) - Существует два способа создания URI – парсинг и построение. Вы должны выполнить парсинг URI, если URI является статическим, или должны создать его, если он динамический. Для парсинга URI применяется метод Parse () класса URI: define variable as OpenEdge.Net.URI no-undo. oURI = URI:Parse(). Для создания URI необходимо создать экземпляр класса URI. Затем использовать методы Path - [Создаём read-only секции](https://rupug.pro/lessons/create-read-only-sections/) - Секциям, в которых данные больше не должны изменяться, можно присвоить статус Read-Only. Установка этого статуса позволяет вам защитить ваши данные от изменения такими операциями как CREATE, UPDATE и DELETE. Кроме того, вы можете максимально уплотнить ассоциированные с такой секцией локальные индексы, что позволит сократить используемое дисковое пространство и улучшить производительность запросов. Когда секция получает - [Собственная обработка ошибок](https://rupug.pro/lessons/own-error-handling/) - Опция NO-ERROR перенаправляет ошибки в системный указатель (handle) ERROR-STATUS. В нем сохраняются все сообщения об ошибках, вызванные оператором с опцией NO-ERROR. Эта информация сохраняется до тех пор, пока не будет выполнен другой оператор с опцией NO-ERROR, независимо от его результата. ERROR-STATUS позволяет проверить, произошла ли вообще какая-нибудь ошибка или произошла ли конкретная ошибка. Для проверок - [Слой представления](https://rupug.pro/lessons/presentation-layer/) - Слой представления (Presentation layer) - это пользовательский интерфейс для Клиентов OpenEdge в вашем приложении. Этот слой взаимодействует с слоем Business Components для получения и отображения данных конечным пользователям. Слой представления, являясь отдельным клиентским процессом, использует общую для многих пользовательских интерфейсов архитектуру MVP (Model-View-Presenter). MVP – это шаблон проектирования пользовательского интерфейса, который был разработан для облегчения - [Слой общей инфраструктуры](https://rupug.pro/lessons/common-infrastructure-layer/) - Слой общей инфраструктуры (Common Infrastructure) отвечает за предоставления общей функциональности для других слоёв, которая может быть следующей: обеспечение безопасности; поиск ресурсов; запуск процедуры; трансформация данных; предоставление контекстной информации. Такая функциональность может понадобиться для слоёв Presentation, Enterprise Services и Business Components. В идеале, вы должны разделить приложение на части так, чтобы иметь возможность использовать одну и - [Слой корпоративных сервисов](https://rupug.pro/lessons/enterprise-services-layer/) - Слой Enterprise Services обеспечивает поддержку внешних OpenEdge Клиентов (не ABL), которые не поддерживают пользовательский интерфейс непосредственно. Поскольку цель приложения, разработанного на основе принципов OERA, состоит в том, чтобы представлять в виде сервисов бизнес-сущности, задачи и рабочие процессы, то вы можете рассматривать внешних OpenEdge Клиентов как процессы, которые запрашивают эти сервисы для получения доступа к бизнес-логике - [Слой источников данных](https://rupug.pro/lessons/data-source-layer/) - Слой Data Source (источники данных) исполняет необходимый код для извлечения, обновления и создания данных в физических источниках, доступных для ABL-приложения. Такими ресурсами могут быть как непосредственно OpenEdge, так и сторонние базы данных, XML-документы и очереди сообщений (Message Queues). Применение источников данных упрощает получение доступа и обновление физических данных через слой Data Access. С помощью источников - [Слой доступа к данным](https://rupug.pro/lessons/data-access-layer/) - Код, реализуемый на уровне слоя Data Access, ассоциирован с соответствующей бизнес-сущностью и определяет, как осуществляется доступ к бизнес-данным. Различают несколько типов доступа к данным: для извлечения, для создания и для обновления. При этом, используя слой Data Access, бизнес-сущность может получать доступ к данным из нескольких источников. Например, для реализации слоя Data Access с именем OrderDA - [Слой бизнес-компонент](https://rupug.pro/lessons/business-components/) - Слой Business Components в OERA представляет собой бизнес-логику приложения, которая используется для предоставления информации Клиентам (слои Presentation и Enterprise Services). Именно здесь вы определяете, как ваши варианты использования реализуются конкретными функциональными возможностями в приложении. В слое Business Components используются следующие основные строительные блоки: Business Entities Business Tasks Business Workflows Существует ещё один элемент – Service - [Слой OERA](https://rupug.pro/lessons/oera-layers/) - Каждый слой приложения, основанного на OERA, играет свою роль, которая определяет его назначение и обеспечивает связь слоя с другими частями приложения. Благодаря взаимосвязям между слоями все части приложения объединяются в единое целое. В следующей таблице представлены слои и их роли: Слой Роль Business Components (Entity, Task, Workflow, Service Interface) Реализует бизнес-логику Data Access Осуществляет инкапсуляцию - [Слияние изменений после обновления](https://rupug.pro/lessons/prodataset-merge-changes-after-an-update/) - Как вы уже знаете, сервер возвращает набор изменений обратно клиенту, при этом возвращённый набор может не соответствовать рабочему набора данных у клиента, поскольку он может содержать изменения, внесённый триггерами базы данных или изменения, внесённые другими пользователями. Такие серверные изменения должны быть объединены с рабочим набором на клиенте. Слияние изменений после обновления отличается от обычного повторного - [Скрытие внешних ключей в XML-файле](https://rupug.pro/lessons/prodataset-hiding-foreign-keys-in-an-xml-file/) - При вложении дочерних таблиц в выходные данные XML можно скрыть значения внешнего ключа в дочерних записях. Если приложение-получатель может точно интерпретировать вложенную структуру XML-данных, ему не нужно видеть значение внешнего ключа, повторяющееся в каждой дочерней записи. В таких случаях скрытие значений внешнего ключа уменьшает размер XML-документа и может обеспечить повышение производительности. Приложения OpenEdge могут правильно - [Системные требования и подготовка](https://rupug.pro/lessons/prodateset-system-requirements/) - Системные требования Перед началом работы убедитесь, что ваша система отвечает следующим минимальным требованиям: Windows 7 (или выше), 64-бит. CPU 1 GHz RAM 4 GB Java Runtime Environment (JRE) plug-in 1.5.0_07 или более поздней версии. Google Chrome (убедитесь, что блокировки всплывающих окон отключены). JavaScript должен быть включён. Настройка упражнений Здесь приведена инструкция по подготовке вашей системы - [Сжатие индексов](https://rupug.pro/lessons/idxcompact/) - С течением времени локальные индексы по разным причинам становятся фрагментированными, что приводит к неэффективному использованию дискового пространства. В этом случае вы должны выполнить сжатие индексов для того, чтобы повысить производительность запросов к таблице. Для сжатия локальных индексов в секционированной таблице в онлайн применяется утилита PROUTIL IDXCOMPACT: proutil db-name -C idxcompact table-name.index-name partition partition-name n Здесь, - [Серверные процессы OpenEdge](https://rupug.pro/lessons/openedge-server-processes/) - Независимо от того, выполняете ли вы тестирование или развёртывание вашего приложения, оно работает в процессорной архитектуре OpenEdge, которая содержит один или несколько клиентских процессов и один или несколько серверных процессов. Поэтому важно понимать, что такое OpenEdge-процессы и как написанный вами код их использует. Как разработчик, вы будете создавать, компилировать и тестировать программный код. При разработке - [Секционирование существующих таблиц с помощью OpenEdge SQL](https://rupug.pro/lessons/partitioning-existing-tables-with-openedge-sql/) - Если для выполнения административных задач вы предпочитаете использовать OpenEdge SQL, то для секционирования существующих таблиц в онлайн применяется оператор SQL ALTER TABLE. Так же, как и при секционировании с помощью Database Administration Console, прежде чем вы сможете разделить существующую таблицу на секции с помощью OpenEdge SQL, вы должны иметь в этой таблице, по крайней мере, - [Секционирование с помощью Data Dictionary и Database Administration Console](https://rupug.pro/lessons/partitioning-with-data-dictionary-and-database-administration-console/) - Перед тем как секционировать существующие таблицы, вы должны удостовериться в том, что: Таблицы, их индексы и LOB-поля размещаются в областях хранения второго типа (Type II). Если таблица не хранится в области второго типа, то она, её индексы и LOB-поля, должны быть перемещены в такую область. О том, как добавить в базу данных область хранения второго - [Сбор статистики с помощью PROUTIL](https://rupug.pro/lessons/collecting-statistics-with-proutil/) - Для сбора и анализа статистики по секционированным таблицам и индексам применяется утилита PROUTIL с одним из следующих классификаторов: PROUTIL TABANALYS PROUTIL IDXANALYS PROUTIL DBANALYS Поскольку DBANALYS формирует единый отчёт, с информацией по таблицам и индексам, то на этом уроке мы не будем рассматривать этот классификатор отдельно. Вместо этого, мы изучим, как использовать классификаторы TABANALYS и - [Руководство по стандартам от Christopher Schreiber](https://rupug.pro/lessons/standards-guide-by-christopher-schreiber/) - Этот стандарт предназначался для разработки традиционных символьных (терминальных) приложений, и определяет только принципы дизайна базы данных и традиционного ABL-кода. Кроме того, с момента его разработки прошло довольно много времени, и некоторые положения потеряли свою актуальность. Дизайн базы данных Общие положения Поле таблицы, ссылающееся на другую таблицу (Foreign Key, FK), должно иметь то же самое имя, - [Резервное копирование средствами операционной системы](https://rupug.pro/lessons/operating-system-backup/) - Если в рамках корпоративной стратегии резервного копирования и восстановления для резервного копирования всех файлов в информационной среде применяются утилиты операционной системы или сторонние инструменты для резервного копирования, то с их помощью можно сформировать полную резервную копию базы данных в офлайн. Последовательность действий для выполнения резервного копирования базы данных OpenEdge в офлайн средствами операционной системы: 1. - [Резервное копирование с помощью OpenEdge Management](https://rupug.pro/lessons/backup-with-openedge-management/) - Помимо утилиты командной строки probkup в СУБД OpenEdge для резервного копирования баз данных можно использовать OpenEdge Management, для этого база данных должна быть добавлена в OpenEdge Management в качестве OpenEdge-ресурса. Некоторые преимущества от использования OpenEdge Management для резервного копирования: Можно создавать резервные копии баз данных на локальном и удалённом сервере. Нет необходимости в создании собственных - [Реализация обработчика событий](https://rupug.pro/lessons/prodataset-implementation-event-handler/) - Обработчик событий – это внутренняя процедура. Процедуры обработки событий можно добавить в файл вызываемой процедуры или разместить их в качестве внутренних процедур в отдельном файле внешней процедуры. В наших примерах мы будем использовать файл внешней библиотеки процедур для хранения обработчиков событий. Описание обработчиков событий в качестве внутренних процедур во внешней процедуре позволяет удобно хранить код, - [Реализация аутентификации](https://rupug.pro/lessons/pasoe-dba-26/) - В безопасной производственной среде необходимо реализовать стратегию аутентификации пользователя. Для этого PAS for OpenEdge использует Spring Security framework. При реализации стратегии аутентификации необходимо принять два решения: Как учётный данные пользователя должны быть акцептованы? Как проверить учётные данные пользователя? Два распространённых варианта приёма учётных данных пользователя в Spring Security framework – это basic (через всплывающее окно) - [Разделяемая память](https://rupug.pro/lessons/shared-memory/) - Следующий компонент архитектуры, который мы рассмотрим – это разделяемая память (Shared memory). Разделяемая память представляет собой область в системной памяти компьютера. СУБД использует разделяемую память для обеспечения одновременного доступа к данным множеству пользователей. Поэтому разделяемая память базы данных существует и доступна только в многопользовательской среде. СУБД OpenEdge использует разделяемую память для: хранения запрошенных пользователем данных, - [Разделение секций](https://rupug.pro/lessons/divided-partitions/) - Вероятно, что со временем у вас может появиться задача по разделению существующей секции на несколько секций меньшего размера. Наиболее частые причины для секционирования: Секция может очень сильно вырасти в размерах, в результате её необходимо разделить на более мелкие, более управляемые секции. Часть данных секции содержит устаревший данные, запросы к которым выполнятся всё реже и реже, - [Развёртывание приложений на экземпляре](https://rupug.pro/lessons/pasoe-dba-7/) - Приложения ABL автоматически разворачиваются при создании экземпляра PAS for OpenEdge в каталоге webapps\ROOT. Каталог ROOT содержит манифест приложения (в папке Meta-INF), статические файлы (в папке Static), а также описания приложения (в файле web.xml) и прочие необходимые ресурсы, такие как классы, транспорты (APSV, REST, SOAP и WEB), файлы безопасности и каталоги PROPATH по умолчанию. На экземпляре - [Развёртывание приложений](https://rupug.pro/lessons/pasoe-dba-23/) - Развёртывание приложений ABL, REST, SOAP и WebSpeed на экземпляре PAS for OpenEdge в производственной среде аналогично развёртыванию этих приложений в среде разработки. Единственная разница заключается в том, что, в то время как экземпляр PAS for OpenEdge для разработки может динамически компилировать и выполнять код приложения, производственный экземпляр PAS for OpenEdge может выполнять только предварительно скомпилированный - [Развёртывание нового приложения WebHandler WebSpeed](https://rupug.pro/lessons/pasoe-dba-17/) - Приложение WebHandler WebSpeed создаётся специально для развёртывания на экземпляре PAS for OpenEdge. В отличие от классического приложения WebSpeed, которое поддерживает только HTTP-команды GET и POST, приложение WebHandler WebSpeed поддерживает все стандартные команды HTTP. Для развёртывания приложения WebHandler Webspeed: Скопируйте код приложения (файлы .cls и .r) в каталог из PROPATH экземпляра. Добавьте обработчик для приложения в - [Развёртывание классического приложения WebSpeed](https://rupug.pro/lessons/pasoe-dba-16/) - Развёртывание классического приложения WebSpeed на экземпляре PAS for OpenEdge – это четырёхэтапный процесс, включающий в себя: Перемещение статических файлов приложения в определённую папку в каталоге экземпляра. Перемещение файлов r-кода приложения. Проверка совместимости экземпляра с классическим приложением WebSpeed. Рестарт экземпляра. Рассмотрим эти этапы. Этап 1 – Перемещение статических файлов приложения в определённую папку в каталоге экземпляра - [Развёртывание SOAP](https://rupug.pro/lessons/pasoe-dba-8/) - Для развёртывания SOAP-сервиса (.wsm) на экземпляре PAS for OpenEdge, в каталоге bin экземпляра должна быть выполнена следующая команда: $CATALINE_BASE/bin/deploySOAP.bat source_descriptor application_name source_descriptor Путь к файлу SOAP с расширением wsm. application_name Название ABL WEB приложения в которое должен быть добавлен сервис. Для развёртывания SOAP-сервиса экземпляр PAS for OpenEdge должен быть стартован. Пример развёртывания SOAP-сервиса для ABL - [Развёртывание REST-сервиса с помощью TCMAN](https://rupug.pro/lessons/pasoe-dba-9/) - Для развёртывания REST-сервиса (.paar) на экземпляре PAS for OpenEdge, в каталоге bin экземпляра должна быть выполнена следующая команда: $CATALINE_BASE/bin/deployREST.bat source_descriptor application_name source_descriptor Путь к файлу REST. Таким файлом может быть файл с расширением PAAR или ZIP-файл, который дополнительно содержит различного рода статичные файлы. application_name Название ABL WEB приложения в который должен быть добавлен сервис. Пример - [Работа с JSON-данными](https://rupug.pro/lessons/prodataset-working-with-json-data/) - Вашему приложению может не понадобиться записывать все данные в файл JSON, поэтому вы можете настроить способ чтения или записи JSON-данных. Далее вы узнаете, как: записать данные дочерней таблицы в виде вложенных элементов JSON; указать в файле JSON имена, отличные от тех, которые описаны в наборе данных; записать подмножество полей временной таблицы в файл JSON. Запись - [Публикация менеджеров приложений](https://rupug.pro/lessons/pasoe-dba-24/) - У вас есть несколько вариантов мониторинга и управления экземпляром PAS for OpenEdge в производственной среде. Вы можете подключиться к производственному экземпляру и использовать TCMAN локально. Кроме того, можно развернуть приложения-диспетчеры, такие как Tomcat manager и OpenEdge manager. В этом случае вы сможете удалённо управлять экземпляром. Если вы решите использовать средства удалённого управления Tomcat manager и - [Публикация и тестирование REST-сервиса](https://rupug.pro/lessons/rest-18/) - После сопоставления REST-операций с ABL-операциями вы можете протестировать REST-сервис в среде разработки с помощью любого REST-клиента на ваш выбор. Но перед этим его необходимо опубликовать на сервере приложений. Публикация REST-сервиса включает в себя: Экспорт пакета REST-приложения из Developer Studio. Развёртывание пакет REST-приложения на экземпляре PAS. В наших примерах мы развернём REST-сервис на экземпляре oepas1, который - [Процедуры и функции](https://rupug.pro/lessons/procedures-and-functions/) - Дизайн Для чего и когда нужно использовать процедуры или функции? Значимыми причинами могут быть: Уменьшение сложности кода Улучшение читаемости кода Предотвращение дублирования кода Скрытие сложного кода Повышение производительности Повторное использование кода Связность (cohesion) — характеристика внутренней взаимосвязи между частями одной процедуры. Хорошо спроектированная процедура хорошо выполняет одно конкретное действие – и не делает ничего другого. - [Процедура старта базы данных](https://rupug.pro/lessons/tune-23/) - После создания файла, содержащего основные параметры старта базы данных, администратор может использовать его для старта базы. В качестве хорошей практики, прежде чем выполнить старт новой базы данных в первый раз, необходимо сформировать резервную копию базы данных, активировать After-Imaging, активировать механизм автоматического управления AI-файлами, а также указать, какие области хранения или объекты базы данных должны использовать - [Процедура создания проекта](https://rupug.pro/lessons/pdsoe-04/) - В правильно спроектированном распределённом приложении клиентская часть должна быть отделена от серверной. Обе эти части будут выполняться отдельными процессами. Поэтому в Developer Studio рекомендуется организовывать раздельное хранение программного кода этих частей в виде отдельных проектов рабочего пространства. Такой подход упрощает развёртывание частей приложения на разных физических системах (сервера приложений, клиентские ПК, мобильные устройства). При разработке - [Процедура переиндексации](https://rupug.pro/lessons/idxbuild-procedure/) - Теперь, когда вы познакомились с синтаксисом PROUTIL IDXBUILD вы готовы к переиндексации. Выполните следующие действия для переиндексации базы данных в оффлайн используя утилиту PROUTIL IDXBUILD: Создайте файл спецификация файлов сортировки. Создайте файл параметров (.pf) со значениями параметров утилиту PROUTIL IDXBUILD. Используйте следующий формат: -db db-name -C idxbuild all parameter-name1 parameter-value1 parameter-name2 parameter-value2 parameter-name3 parameter-value3 ... - [Профилировщик Profiler](https://rupug.pro/lessons/profiler/) - Профилировщики производительности является распространенными и полезными инструментами для разработчиков программного обеспечения. Вкратце, профилировщик обеспечивает «профиль» исполнения конкретной программы. Профилировщик обычно обеспечивает построение дерева вызовов и тайминг исполнения; Эта информация позволяет определить, какие части программы выполняются дольше всего. Progress Software включает профилировщик Profiler в комплект поставки OpenEdge (каталог /samples/profiler1.1 на диске с документацией), но на условиях - [Просмотр информации об имеющихся секциях](https://rupug.pro/lessons/view-information-about-existing-partitions/) - В некоторых случаях вам может потребоваться посмотреть список имеющихся в базе данных секций и/или их статус, чтобы определить на какой стадии вы находитесь в процессе разделения таблицы. Например, предположим, что вы выполняете перемещение данных из исходной композитной секции в split-target секции, и вы хотите понять, на какой стадии миграции данных вы находитесь. Для этого применяется - [Пропуск начальных значений в XML-файле](https://rupug.pro/lessons/prodataset-skipping-the-initial-values-in-the-xml-file/) - Ещё один необязательный параметр, который может увеличить производительность, это omit-initial-values. AVM исключает из XML-документа поля временной таблицы, содержащие заданное начальное значение, при установке этому параметру значения TRUE. Это может значительно уменьшить размер XML-документа. Приложения OpenEdge могут правильно интерпретировать пропущенные значения. Однако, если ваше приложение отправляет XML-документ в приложение, отличное от OpenEdge, вы должны убедиться, что - [Производительность – Введение](https://rupug.pro/lessons/performance-introduction/) - Производительность информационных систем зависит как от приложения, так и от программно-аппаратной среды, в которой работает приложение. Хотя различие между производительностью приложений и систем несколько условно, производительность приложения зависит от дизайна кода и методов программирования, в то время как производительность системы зависит также от реализации платформы OpenEdge и ограничений, присущих системе аппаратных средств, операционной системе и - [Проектирование физической структуры БД](https://rupug.pro/lessons/tune-7/) - От подхода к проектированию физической структуры базы зависит производительность - корректная организация данных на дисковых носителях определяет насколько эффективно данные будут считываться, обрабатываться в памяти и записываться обратно. При проектировании физической структуры БД обычно следуют определённым принципам. Сначала определяют следующие метрики для таблиц, индексов и LOB (Large Objects) в базе данных: Количество и типы областей - [Проверка схемы XML](https://rupug.pro/lessons/prodataset-checking-the-xml-schema/) - Методы READ-XML и READ-XMLSCHEMA используют необязательный параметр verify-schema-mode для того, чтобы указать AVM какой тип проверки следует использовать. Существует три типа проверки схемы: STRICT LOOSE IGNORE Все три типа доступы методу READ-XML, но для метода READ-XMLSHEMA доступны только LOOSE и STRICT. Как работает проверка STRICT Проверка STRICT требует, чтобы имена таблиц, имена полей и отношения - [Проверка резервной копии](https://rupug.pro/lessons/checking-your-backup/) - После создания резервной копии базы данных рекомендуется выполнить проверку её целостности. Проверку целостности резервной копии необходимо делать сразу после её генерации, так как в случае обнаружения каких-либо ошибок можно сразу повторить процесс резервного копирования. Проверка резервной копии может быть выполнена утилитой командной строки prorest или через консоль OpenEdge Management. Эти инструменты предназначены только для проверки - [Пример использования REST API](https://rupug.pro/lessons/pasoe-dba-37/) - Развернув приложение OpenEdge manager на вашем экземпляре PAS for OpenEdge, вы обеспечили доступ к нему только для чтения (мониторинг) и только для записи (управление). Теперь всё, что вам нужно – это REST-клиент, который позволит выполнять стандартные операции HTTP, такие как GET, PUT, POST и DELETE. Далее мы рассмотрим пример, демонстрирующий, как использовать API “metrics” и - [Пример Best Practices – использование локальных буферов](https://rupug.pro/lessons/best-practices-example-using-local-buffers/) - Локальные буферы записей могут быть использованы на уровне блоков процедур, таких как внутренние процедуры, функции, методы классов и т.д. Использование локальных буферов может предотвратить возникновение трудно обнаруживаемых ошибок и позволяет сделать код более надежным и легко сопровождаемым. Глобальные буферы можно рассматривать как подкласс глобальных данных. Согласно Steve McConnell’s Code Complete: Сущностью создания программ, размер которых - [Применение наборов данных](https://rupug.pro/lessons/prodataset-using/) - Наборы данных могут использоваться в трёх основных областях большинства приложений: Клиентская («front end») обработка пользовательской активности и отображение данных. Транспортировка сложных структур данных из одной процедуры в другую. Обработка бизнес-логики на стороне сервера, извлечение данных и хранение данных. В этом учебном пособии приведены примеры всех трёх областей использования набора данных. В то время как существует - [Применение OERA в проектировании приложений](https://rupug.pro/lessons/using-oera-in-application-design/) - Как архитектору или разработчику вам необходимо определить, какие части вашего приложения будут следовать принципам проектирования OERA, которые рекомендует Progress Software. Для начала вам необходимо собрать все требования к приложению. Если у вас уже есть готовые части приложения, то необходимо решить, будете ли вы их модернизировать в соответствии с OERA. Для того, чтобы правильно разделить приложение - [Прежде чем начать](https://rupug.pro/lessons/pasoe-dba/) - Перед тем как продолжить работу с представленным материалом, необходимо подготовить среду для выполнения практических заданий. В первую очередь на вашем персональном компьютере должны быть установлены следующие продукты OpenEdge не ниже версии 11.7.5: OpenEdge Enterprise RDBMS Progress Application Server for OpenEdge (Production или Development) Если у вас нет действующих лицензий на эти продукты, то вы можете - [Предоставление информации об ошибке клиенту](https://rupug.pro/lessons/prodataset-providing-error-information-to-the-client/) - Когда на сервере возникает ошибка, мы можем вернуть полезную информацию клиенту с использованием атрибута ERROR-STRING. Этот атрибут может быть установлен на уровне строки как для системной ошибки, так и для ошибки, связанной с данными. Также он может быть установлен на уровне временной таблицы для предоставления сводной информации об ошибках в ней. Атрибут ERROR-STRING обычно устанавливается - [Предоставление доступа к базе данных](https://rupug.pro/lessons/providing-access-to-database/) - Прежде чем пользователи смогут стартовать сессии, необходимо предоставить им возможность подключения к базе данных. Это можно сделать двумя способами: Подготовить сетевые файлы для подключения к базе данных дистанционных клиентов по TCP/IP. Подготовить переменные среды окружения для подключения к базе данных самообслуживающихся клиентов. Подготовка сетевых файлов Чтобы пользователи могли успешно стартовать сессии базы данных, необходимо правильно - [Практическое занятие №4](https://rupug.pro/lessons/try-it-1-4/) - Теперь мы готовы протестировать наше приложение используя Progress Application Server for OpenEdge, а после успешного тестирования остановим сервер базы данных и экземпляр PAS for OpenEdge. 1. Откройте в Developer Studio рабочее пространство, которое мы с вами создали ранее. 2. Двойным щелчком мыши откройте процедуру SimpleClient.p, из проекта TestClient/src. Процедура откроется в редакторе OpenEdge. 3. В коде - [Практическое занятие №3](https://rupug.pro/lessons/try-it-1-3/) - В этом задании необходимо стартовать сервер тренировочной базы данных и настроить экземпляр PAS for OpenEdge. Задание 1. Старт базы данных 1. Откройте командную строку OpenEdge. Для этого щёлкните в Windows по кнопке Start и выберите пункт Progress -> OpenEdge –> Proenv 2. В Proenv перейдите в каталоге \introdev\exercise 3. Выполните старт базы данных следующей командой: proserve - [Практическое занятие №2](https://rupug.pro/lessons/try-it-1-2/) - В этом задании необходимо создать проект для клиентской части тренировочного приложения. После этого импортировать в этот проект файл SimpleClient.p. Задание 1. Создание нового проекта 1. В основном меню выберите File -> New -> OpenEdge Project. В мастере создания нового проекта укажите имя проекта TestClient. Щёлкните по иконке General, чтобы выбрать режим создания обычного проекта OpenEdge - [Практическое занятие №1](https://rupug.pro/lessons/try-it-1-1/) - На этом практическом занятии вы выполните настройку Developer Studio и создадите OpenEdge-проект. Затем импортируете в рабочее пространство некоторые файлы проекта тренировочного приложения. В заключение выполните тестирование приложения с использованием экземпляра PAS for OpenEdge для бизнес-логики и базы данных OpenEdge для данных. Практическое занятие разделено на пять заданий, на выполнение которых вы можете использовать столько времени, - [Практическое занятие 8.3](https://rupug.pro/lessons/try-it-8-3/) - На этом занятии вы потренируетесь в бинарной загрузке данных и в загрузке значений секвенций. Задание 1. Загрузка данных в бинарном виде утилитой proutil В этом задании необходимо выполнить бинарную загрузку содержимого таблиц Customer и Order (файлы с расширением .bd) в базу данных sports82, используя утилиту proutil с одновременным построением индексов. Напомним, бинарные файлы находятся в - [Практическое занятие 8.2](https://rupug.pro/lessons/try-it-8-2/) - На предыдущем занятии вы выполнили несколько различных выгрузок из базы данных sports81. На этом занятии необходимо создать целевую базу данных sports82 и выполнить загрузку в неё этих файлов. Сначала вы попрактикуетесь в загрузке файла описания данных с помощью Data Administration. Затем загрузите данные в текстовом виде методом массовой загрузки (Bulk Load). Задание 1. Создание целевой - [Практическое занятие 7.1](https://rupug.pro/lessons/tryit-7-1/) - На этом практическом занятии необходимо: добавить в базу данных sports61 три AI-экстента фиксированного размера в онлайн; активировать в онлайн механизмы After-Imaging и AI File Management с помощью утилиты probkup online; добавить в базу данных несколько новых записей; дождаться формирования AI-архивов; с помощью утилиты prorest создать новую базу данных sports61_3; применить к базе sports61_3 архивы AI-экстентов - [Практическое занятие 6.1](https://rupug.pro/lessons/tryit-6-1/) - На этом практическом занятии необходимо выполнить серию резервных копий, включая полную онлайн копию и инкрементальные копии, для существующей базы данных. Затем восстановить все резервные копии в новую базу данных. Полная резервная копия базы данных sports61 должна быть создана в онлайн с помощью OpenEdge Management, а инкрементальные копии этой же базы – утилитой командной строки probkup. - [Практическое занятие 5.1](https://rupug.pro/lessons/tryit-5-1/) - Предположим, что после мониторинга базы данных test31 вы обнаружили, что области хранения Order, Employee и Cust_Data приблизились к пороговым размерам. В этом случае требуется добавить в эти области новые экстенты. Кроме того, вы решили переместить AI-экстенты базы данных в отдельный каталог. На выполнения всех заданий отводится 15 минут. Перед тем как приступить к выполнению заданий - [Практическое занятие 4.2](https://rupug.pro/lessons/tryit-4-2/) - На этом практическом занятии необходимо добавить базу данных в OpenEdge Management, настроить её и затем выполнить старт и останов. Задание 1. Добавление базы данных в OpenEdge Management Шаг Действие 1 Откройте консоль OpenEdge Management: Start -> All Programs -> Progress -> OpenEdge -> Database Administration Console. 2 Откройте страницу Database Migration Utility. Щёлкните мышью по - [Практическое занятие 4.1](https://rupug.pro/lessons/tryit-4-1/) - Выполняя следующие задания, вы попрактикуетесь в старте и останове одного брокера базы данных. Затем, на основании заданных требований к базе данных, рассчитаете значения параметров старта базы данных, создадите файлы параметров для ABL- и SQL-брокеров, выполните старт брокеров с помощью файлов параметров и в завершение выполните останов базы данных. Задание 1. Старт и останов одного брокера - [Практическое занятие 3.1](https://rupug.pro/lessons/tryit-3-1/) - На этом занятии вы попрактикуетесь в создании базы данных. Сначала вы создадите структурный файл, затем пустую базу данных и в завершение заполните её данными базы данных sports2000. На выполнение задачи отводится 15 минут. Шаг Действие 1 Откройте Proenv. 2 В рабочем каталоге (C:\OpenEdge\WRK) создайте каталог test31. mkdir test31 3 Используя любой редактор, создайте структурный файл - [Постановка задачи](https://rupug.pro/lessons/statement-2-1/) - На этом практическом занятии вы создадите новые секционированные таблицы и связанные с ними политики. Занятие разделено на три задания: Создать две секционированные таблицы tpInvoice и tpPurchaseOrder с помощью Data Dictionary. Создать политику секционирования и её детали для таблицы tpInvoice с помощью Database Administration Console. Создать политику секционирования и её детали для таблицы tpPurchaseOrder с помощью - [Постановка задачи](https://rupug.pro/lessons/statement-6/) - На этом занятии вы попрактикуетесь в сборе и анализе статистики по таблицам и индексам с помощью PROUTIL Прежде, чем приступить к этому занятию, необходимо выполнить все задания из практического занятия пятого урока. - [Постановка задачи](https://rupug.pro/lessons/statement-5/) - На занятии из третьего урока в одном из заданий вы реализовали подсекционирование list-list в таблице Customer на основе столбцов Country и Salesrep. В результате таблица была разделена на 23 секции. На этом занятии вы попрактикуетесь в работе с локальными индексами этих секций. Сначала вы перестроите все локальные индексы для трёх секции с данными Франции. Затем - [Постановка задачи](https://rupug.pro/lessons/statement-4/) - На предыдущем занятии в одном из заданий вы реализовали list-range подсекционирование в таблице Order, основываясь на столбцах Carrier и OrderDate. В результате было создано 12 секций, по две секции для каждого значения Carrier, где первая имеет верхнюю границу диапазона 2000 год, а вторая 2010 год. На этом занятии вы попрактикуетесь в управлении секциями, выполняя задачи, - [Постановка задачи](https://rupug.pro/lessons/statement-3-1/) - На этом занятии мы секционируем две существующие таблицы в базе данных sportco. Занятие поделено на четыре части. В первой части необходимо создать секционно-ориентированные индексы для таблиц Customer и Order, используя для этого инструментарий Data Dictionary. Во второй части мы реализуем подсекционирование таблиц Customer и Order по list-list и list-range соответственно. Необходимые политики секционирования для них - [Поиск в рабочем пространстве](https://rupug.pro/lessons/pdsoe-08/) - По мере добавления в приложение новых проектов, папок и файлов может возникнуть необходимость поиска в проекте или в рабочем пространстве определенного файла или текстовой строки в исходных файлах ABL. Далее приведены шаги для поиска текстовой строки в рабочем пространстве. Вы попрактикуетесь в поиске во время выполнения заданий третьего упражнения. Щёлкните по иконке на панели инструментов - [Поддержка сложных приложений](https://rupug.pro/lessons/pdsoe-12/) - Большие приложения могут содержать несколько проектов со сложными структурами каталогов, используемых для организации слоёв приложения. Вы уже знаете, как выполнять поиск в рабочем пространстве файлов или текст в файлах. В Developer Studio есть ещё две функции, которые помогут вам в поиске и организации ABL-контента в ваших проектах – это References и Organize USING Statements. Что - [Подготовка секций к миграции данных с помощью Database Administration Console](https://rupug.pro/lessons/preparation-of-sections-for-data-migration-using-the-database-administration-console/) - После того, как вы разделили существующую таблицу, следующее, что необходимо сделать - это подготовить секции к миграции данных. Оптимальный способ - это подготовка секции непосредственно перед перемещением данных. Подготавливать каждую секцию и перемещать данные вы можете в удобное для вас время. Миграция данных может осуществляться как сразу во все секции, так и по отдельности. При - [Подготовка секции к миграции данных с помощью OpenEdge SQL](https://rupug.pro/lessons/preparation-section-to-migrate-data-using-openedge-sql/) - Так же, как и в Database Administration Console, после секционирования существующей таблицы с помощью OpenEdge SQL, все секции получают статус Allocated и Composite, а все имеющиеся данные находятся в исходной композитной секции. Следующая задача – это с помощью SQL ALTER TABLE подготовить секции к миграции и выполнить перемещение данных. Подготовка каждой секции к миграции должна - [Подготовка клиентского кода для получения набора данных с сервера](https://rupug.pro/lessons/prodataset-preparing-client-code-to-retrieve-a-dataset-from-the-server/) - Как правило код серверной части приложения, предназначенный для извлечения данных из базы для заполнения набора данных от имени клиента, должен исполняться на сервере приложений. В нашем случае мы будем исполнять его на сервере приложений PAS for OpenEdge. Поэтому сначала разберёмся как выполнить подключение к серверу приложений. Ниже приведён пример, показывающий как клиент подключается к экземпляру - [Подготовка к созданию приложения REST WEB](https://rupug.pro/lessons/rest-13/) - Перед созданием REST WEB приложения из существующего ABL-приложения необходимо: убедиться в том, что ваше ABL-приложение работает в режиме state-free; собрать информацию об ABL-ресурсах, которые вы хотите представить в качестве REST-ресурсов. Приложение REST WEB может использовать сервисы только из одного проекта OpenEdge. Поэтому необходимо определить проект, который будет использоваться для создания REST WEB приложения. Приложения REST - [Подготовка к Roll-forward Recovery](https://rupug.pro/lessons/prepare-to-roll-forward-recovery/) - Механизм Roll-forward Recovery использует последнюю резервную копию базы данных и все архивы AI-экстентов, которые были созданы после формирования этой резервной копии, для восстановления базы данных до момента сбоя. Для применения Roll-forward Recovery в первую очередь необходимо создать стратегию резервного копирования. На этом уроке мы будем использовать стратегию резервного копирования в онлайн. Подготовка к реализации Roll-forward - [Подведение итогов](https://rupug.pro/lessons/summarizing-2/) - Я надеюсь, что этот тренинг будет для вас хорошей стартовой площадкой для изучения и применения OpenEdge Table Partitioning в ваших базах данных OpenEdge. Если у вас возникли какие-либо технические вопросы, в том числе по содержанию тренинга, то приглашаю обсудить их на специальном форуме, который создан для этого тренинга: Введение в OpenEdge Table Partitioning Больше информации об - [Подведение итогов](https://rupug.pro/lessons/pdsoe-20/) - Поздравляю! Вы завершили тренинг «Введение в Progress Developer Studio for OpenEdge» и я надеюсь, что полученная информация окажется полезной в вашей работе. Буду рад прочитать ваши отзывы! Теперь вы знаете как: создавать, запускать и настраивать параметры рабочего пространства; создавать и импортировать проекты и файлы в рабочее пространство; использовать перспективу редактора OpenEdge для редактирования, компиляции и - [Подведение итогов](https://rupug.pro/lessons/rest-50/) - Вы завершили тренинг по работе с REST сервисами в ABL. Теперь вы знаете, как можно легко создать REST-приложение из существующего ABL-приложения, научились настраивать сервер приложений PAS for OpenEdge для работы с REST-сервисами, опубликовывать и тестировать REST-приложение. А также узнали, как работать с внешними REST-сервисами из ABL. Дополнительная информация по REST WEB в OpenEdge: Документация по - [Подведение итогов](https://rupug.pro/lessons/pasoe-dba-40/) - Поздравляю! Вы завершили тренинг «Введение в PAS for OpenEdge (администрирование)». Я надеюсь, что полученная информация окажется полезной в вашей работе. Буду рад прочитать ваши отзывы! Теперь вы знаете как: создавать и настраивать PAS for OpenEdge в среде разработки; разворачивать приложения WebSpeed на экземпляре PAS for OpenEdge в среде разработки; стартовать экземпляр PAS for OpenEdge в - [Подавление ошибок](https://rupug.pro/lessons/error-suppression/) - Опция NO-ERROR в операторе ABL полностью подавляет обработку ошибок: Не выводится никаких сообщений. Выполнение продолжается со следующего оператора. Управление не передается обработчику ошибок блока. Замечание: Опция NO-ERROR не подавляет состояние STOP. Для справки, смотри OpenEdge Development: ABL Reference. В некоторых случаях действие опции NO-ERROR может отличаться от стандартного, в зависимости от конкретного оператора. Если в - [Платформа OpenEdge](https://rupug.pro/lessons/the-openedge-platform/) - Платформа Progress® OpenEdge™ предназначена для разработки современных информационных приложений. OpenEdge предоставляет производителям программного обеспечения все возможности, необходимые для быстрой разработки и поддержки надежных высокопроизводительных бизнес-приложений. Гибкость технологий, заложенных в платформу OpenEdge, обеспечивает эффективную интеграцию, а наличие инструментов по анализу и управлению помогают оптимизировать производительность информационных систем. Разработчиком платформы является корпорация Progress Software, штаб-квартира в городе - [План резервного копирования](https://rupug.pro/lessons/backup-plan/) - В современном мире большинство компаний должны обеспечивать круглосуточную работу ИТ-инфраструктуры. Это означает, что администратор должен гарантировать высокую доступность базы данных для пользователей. Первым важным шагом в достижении высокой доступности является резервное копирование и успешное восстановление базы данных. Наличие резервной копии позволяет быстро реагировать на незапланированные простои, связанные с выходом из строя носителей, ошибками пользователей, повреждениями - [Перестройка локальных индексов](https://rupug.pro/lessons/rebuilding-local-indexes/) - Индексы для секций таблицы перестраиваются, как правило, в следующих случаях: Вы только что выполнили загрузку бинарных данных в одну или несколько секций. Вы хотите избавиться от индексной фрагментации, восстановить дисковое пространство после удалённых индексных ключей, сжать индексные блоки для минимизации используемого дискового пространства, а также для улучшения производительности запросов. Вам необходимо исправить физические повреждения в - [Перенос секции в другую область хранения](https://rupug.pro/lessons/moving-a-partition-to-another-storage-area/) - В некоторых случаях может понадобиться перенести секцию в новую область хранения, наиболее частые причины приведены ниже: Секция интенсивно используется и размещается на том же устройстве хранения, что и другие секции. Негативное влияние на производительность велико. Для повышения производительности вы решили перенести секцию на другое устройство хранения. Доступное пространство для хранения на диске закончилось или заканчивается. - [Перемещение экстентов](https://rupug.pro/lessons/moving-extents/) - Помимо мониторинга использования экстентов базы данных, необходимо контролировать заполнение экстентами пространства на диске. Существует множество административных инструментов, позволяющих отслеживать свободное место на диске. В СУБД OpenEdge для этого можно воспользоваться консолью OpenEdge Management. Если вы заметили, что ваша база данных вот-вот заполнит выделенное ей пространство на диске, вы можете переместить часть экстентов с одного диска - [Перемещение таблиц](https://rupug.pro/lessons/tune-14/) - Со временем части базы данных будут расти или может измениться модель её использования. Когда это произойдёт администратор может внести дополнительные изменения в физическую структуру базы данных чтобы гарантировать продолжение её работы с максимальной эффективностью. Для достижения этого создаётся отдельный структурный файл, который содержит описания только новых областей хранения. После чего новые области добавляются к физической - [Перемещение существующих данных](https://rupug.pro/lessons/moving-existing-data/) - После подготовки описания секции можно приступить к онлайн-перемещению существующих данных из исходной композитной секции в split-target секцию. Как только перемещение будет завершено - split-target секция становится регулярной. Разделение секций является ресурсоёмким процессом. Соответственно, вы должны выполнять разделение во время периода низкого уровня активности вашего приложения. Большие таблицы, если есть такая возможность, лучше разделять по отдельным - [Перемещение индексов в другую область хранения](https://rupug.pro/lessons/moving-indexes-to-another-storage-area/) - Обычно потребность в перемещении индексов возникает в следующих ситуациях: Индекс интенсивно используется и при этом он находится в одной области хранения с прочими локальными индексами. Поэтому, для улучшения производительности, имеет смысл переместить его в отдельную область хранения. На диске, где размещён индекс, свободное дисковое пространство на исходе. Следовательно, этот индекс необходимо переместить в другую область - [Перемещение индексов](https://rupug.pro/lessons/tune-15/) - Для максимальной производительности индексы таблицы рекомендуется перемещать в новую область хранения одновременно с перемещением таблицы утилитой PROUTIL TABLEMOVE. Но если перенос таблицы не требуется, а в ней обнаружен интенсивно используемый индекс, то для улучшения производительности базы данных такой индекс можно отдельно перенести в персональную область хранения. Для перемещения индекса в онлайн применяется утилита PROUTIL IDXMOVE. - [Перемещение BI-файлов](https://rupug.pro/lessons/tune-16/) - Хорошей практикой считается, когда BI-экстенты базы данных размещаются на отдельном диске не содержащем области с прикладными данными или AI-экстенты. Такой подход уменьшает дисковую конкуренцию и улучшает производительность. Кроме того может возникнуть ситуация, когда необходимо переместить существующие BI-файлы на новый, более быстрый диск. Следующие действия описывают процедуру перемещения BI-файлов: Остановить базу данных. Выполнить усечение BI командой - [Переименование секций](https://rupug.pro/lessons/renaming-partitions/) - В определенных ситуациях вам может понадобиться изменить имя существующей секции. Простой пример, после того, как вы разделили range-секцию на более мелкие секции, исходная секция будет представлять собой одну из таких мелких частей и содержать данные, соответствующие её верхнему диапазону. Это означает, что имя исходной секции теперь не будет соответствовать данным, которые она содержит, соответственно, вы - [Параметры старта After-Imaging](https://rupug.pro/lessons/tune-20/) - Хорошей практикой считается, когда в базе данных всегда активирован механизм After-Imaging (AI), благодаря чему администратор сможет восстановить базу данных на любой момент времени в случае каких-либо сбоев. Вы уже знаете, как определять количество и размеры AI-экстентов для достижения хорошей производительности. В дополнение к этому, для минимизации активности ввода-вывода AI можно задействовать специальный параметр старта базы - [Параметры для настройки сетевой коммуникации](https://rupug.pro/lessons/tune-21/) - В многоуровневой среде приложений клиенты взаимодействуют с сервером базы данных по сети. Сетевая коммуникация является ещё одним потенциальным источником узких мест, которые могут привести к снижению производительности. СУБД OpenEdge упаковывает записи в сетевые сообщения при выполнении запросов к базе данных от удалённых пользователей. Записи сохраняются в кэше упреждающей выборки (prefetching) и становятся доступны сразу же, - [Параметры AI File Management для старта базы данных](https://rupug.pro/lessons/ai-file-management-startup-parameters/) - После активации AI File Management в онлайн или в офлайн, необходимо добавить в параметры старта базы данных параметр -aiarcdir и, если для архивации применяется режим Timed, параметр -aiarcinterval: proserve db-name -aiarcdir dirlist -aiarcinterval number-of-seconds В противном случае при старте базы данных СУБД сообщит об ошибке и база не будет стартована. Если база данных зарегистрирована - [Пакетная обработка данных](https://rupug.pro/lessons/prodataset-batch-processing/) - До этого момента мы изучили использование внутренних процедур обработки событий для управления операциями заполнения и изменения. Но обработчики событий можно использовать и для пакетного извлечения данных с сервера. На производительность приложения оказывает влияние объём пересылаемых по сети данных. Если слишком большое количество (пакет) записей отправляется сразу, то пользователю вероятно придётся ожидать их получения. Если отправлено - [Очистка набора данных](https://rupug.pro/lessons/prodataset-clearing/) - Существует два метода очистки после использования наборов данных в серверном коде: DETACH-DATA-SOURCE EMPTY-DATASET DETACH-DATA-SOURCE Как правило, следует отключать источники данных от набора данных после завершения работы с ним, если позже вы не собираетесь заполнять или обновлять набор в процедуре, в которой был вызван метод FILL. Синтаксис отключения источника данных: :DETACH-DATA-SOURCE(). Пример: BUFFER ttOrder:DETACH-DATA-SOURCE(). В этом - [Отладка](https://rupug.pro/lessons/rest-37/) - Функциональность отладки можно включить с помощью переключателя командной строки debugalert или с помощью атрибута session:debug-alert. Если для атрибута session:debug-alert установлено значение true, то во временном каталоге сессии создаются два файла «request-raw.txt» и «response-data-receive.txt» (по умолчанию в C:\OpenEdge\WRK). Вы также можете записать предопределённые сообщения сокета и куки в определенный файл журнала, используя атрибут log-manager:logfile-name. - [Отключение табличного секционирования в базе данных](https://rupug.pro/lessons/disabling-table-partitioning-in-the-database/) - Если по каким-то причинам вы решили отключить табличное секционирование в базе данных, то это возможно. Но стоит помнить об одном важном моменте: отключение табличного секционирования предполагает удаление данных из всех секционированных таблиц, соответственно, вы должны выгрузить данные из них прежде, чем выполнить отключение. Для отключения табличного секционирования в базе данных выполните следующую последовательность шагов: Выполните - [Откат действий блока](https://rupug.pro/lessons/undo-block/) - Оператор UNDO служит для отката действий блока, когда бизнес-логика приложения обнаруживает проблему, которая должна быть обработана как ошибка приложения. Соответственно, Вам требуется тот же уровень поддержки для обработки ошибок приложения. Смотри (Программа 29). Здесь фраза ON ERROR отсутствует, оператор IF в Inner-Block моделирует обнаружение логической ошибки приложения и выполняет откат блока. Программа 29. Обработка ошибки - [От автора](https://rupug.pro/lessons/from-the-author/) - Каждый урок тренинга разделён на две части: теория и практика. Это означает, что после изучения теории вы будете должны самостоятельно выполнить некоторые задания во время практических занятий. В связи с этим: Все задания должны выполняться последовательно и обязательно. Не допускается их избирательное исполнение. Все команды, предлагаемые в пособии, должны быть реализованы на тестовой базе данных, - [Останов базы данных в многопользовательском режиме](https://rupug.pro/lessons/database-shutdown-in-multi-user-mode/) - Базы данных должны работать в режиме 24х7. Но на практике её иногда приходится останавливать для выполнения таких административных задач, как: формирование резервных копий и восстановление базы данных в офлайн; перестройка индексов в офлайн; усечение BI-файла; установка обновлений OpenEdge. Когда вы останавливаете базу данных, соблюдайте следующие правила: Останавливайте базу данных, когда с ней не работают пользователи. - [Основы обработки ошибок](https://rupug.pro/lessons/error-handling-basics/) - В ABL имеются четыре типа ошибок (состояния, condition): ERROR, STOP, ENDKEY и QUIT: Состояние ERROR возникает, когда OpenEdge не может выполнить код ABL, обычно на уровне операторов. Состояние STOP устанавливается, когда происходит невосстановимая системная ошибка, например, когда потеряно соединение с базой данных или оператор RUN не может найти указанную программу. Состояние QUIT возникает только при - [Основные процессы](https://rupug.pro/lessons/basic_processes/) - Брокер Брокер – это главный процесс базы данных, который создаёт и управляет разделяемой памятью в многопользовательской базе данных. Брокер выполняет следующие задачи в четырёх фазах работы базы данных: Старт базы данных для обеспечения согласованности и целостности данных автоматически выполняет Crash Recovery; на основе заданных параметров старта базы данных создаёт экземпляр разделяемой памяти и файл локировки - [Основные компоненты СУБД](https://rupug.pro/lessons/components-of-dbms/) - СУБД OpenEdge состоит из следующих компонент: База данных на диске – набор физически файлов в операционной системе и логических структур хранения, которые содержат постоянные данные на диске. Физическая база данных состоит из областей хранения, экстентов, кластеров и блоков. Как администратор вы отвечаете за управление физической базой данных. Разделяемая память – область в разделяемой памяти, которая - [Определение размеров области Before-Image](https://rupug.pro/lessons/tune-12/) - СУБД OpenEdge использует область хранения Before-Image (BI) для сохранения BI-заметок, описывающих все транзакции в базе данных и предназначенных для восстановления базы данных после сбоев. Восстановление достигается путём повторения всех транзакций, которые были успешно завершены, и отменой всех транзакций, которые были прерваны, что гарантирует целостность и сохранность базы данных. Однако сохранение BI-заметок в BI-файлы приводит к - [Определение размеров областей After-Image](https://rupug.pro/lessons/tune-13/) - СУБД использует области хранения After-Image для сохранения AI-заметок, описывающих все транзакции базы данных и предназначенных для восстановления базы данных после сбоев на уровне диска. Используя резервные копий базы данных и архивы AI-областей, администратор базы данных может восстановить завершённые транзакции вплоть до момента возникновения сбойной ситуации. Как и с BI-файлами, сохранение AI-заметок в AI-файлы приводит к - [Описание урока](https://rupug.pro/lessons/pasoe-dba-33/) - Как администратор сервера приложений PAS for OpenEdge, вы должны периодически выполнять мониторинг своей среды PAS for OpenEdge и искать индикаторы проблем. Мониторинг сервера приложений представляет собой просмотр ключевых процессов PAS for OpenEdge, включая менеджеров сеансов, многосессионных агентов, настроенные транспорты и развёрнутые приложения. И если есть какие-то проблемы, то вы должны принять соответствующие меря для их - [Описание урока](https://rupug.pro/lessons/pasoe-dba-20/) - Установка, настройка и управление сервером приложений PAS for OpenEdge в производственной среде отличается от выполнения тех же задач в среде разработки. В среде разработки основное внимание уделяется тому, чтобы упростить разработчику задачу и повысить его продуктивность. В производственной среде основное внимание уделяется безопасности. На этом уроке вы узнаете, как создавать, настраивать и управлять экземпляром PAS - [Описание урока](https://rupug.pro/lessons/pasoe-dba-15/) - В классическом развёртывании публикация приложений WebSpeed выполняется в среде, состоящей из стороннего веб-сервера, мессенджера WebSpeed, транзакционного сервера WebSpeed (который состоит из брокера и агентов WebSpeed) и, при необходимости, сервера имён (NameServer). Начиная с Progress OpenEdge 11.6 вы можете развернуть своё приложение WebSpeed на сервере приложений Progress Application Server for OpenEdge (PAS for OpenEdge), который обеспечивает - [Описание урока](https://rupug.pro/lessons/pasoe-dba-2/) - СУБД Progress OpenEdge имеет два сервера приложений, которые могут быть использованы для запуска бизнес-логики ABL-приложения — сервер приложений Progress Application Server for OpenEdge (PAS for OpenEdge) и классический OpenEdge AppServer. Классический AppServer требует дополнительных процессов, включая Name Server для поиска и регистрации процессов во время выполнения, Admin Server для старта, и адаптеры OpenEdge для передачи - [Описание набора данных](https://rupug.pro/lessons/prodataset-description/) - Создание набора данных похоже на инструкцию по сборке книжной полки: Из предыдущего урока вы узнали, что наборы данных состоят из таких элементов как, Временные таблицы и их взаимосвязи. Источники данных. Порядок описания и использования наборов данных, следующий: Описание временной таблицы для каждой таблицы базы данных, которую хотите использовать в наборе данных. Описание набора данных с - [Описание и привязка источников данных к набору данных](https://rupug.pro/lessons/prodataset-binding-data-sources/) - После того, как набор данных был описан, он всё ещё не содержит данные. Для заполнения набора данных необходимо связать буфер каждой временной таблицы из набора с соответствующим объектом-источником данных. Как только они связаны, набор данных готов к заполнению данными. Источники данных рекомендуется описывать во встраиваемом файле, после чего в файле процедуры серверной части приложения необходимо - [Описание занятия](https://rupug.pro/lessons/tune-tryit-8/) - Приложение ATM (Automatic Teller Machine) содержит скрипт go.bat, который порождает несколько процессов пакетной обработки (ATM-клиентов) для имитации открытия депозитов и снятия денежных средств в заданный периода времени. Каждый ATM-клиент выполняет циклы транзакций до тех пор, пока тест не завершится. Приложение ATM интенсивно обновляет базу данных. Каждый запуск состоит из трёх этапов: 30 секунд для «разгона» - [Описание занятия](https://rupug.pro/lessons/rest-19/) - На предыдущем занятии вы импортировали приложение-пример в Developer Studio. Напомним, что приложение-пример содержит два проекта, CustomerOrderApp и ClientCustomerOrderApp. Проект CustomerOrderApp состоит из файлов (ABL-ресурсов), которые работают на oepas1. Эти файлы находятся в папке AppServer проекта. На этом практическом занятии вы представите ABL-ресурсы из приложения-примера в качестве REST-сервиса. Для этого вы свяжете операции этих ресурсов с - [Описание занятия](https://rupug.pro/lessons/rest-6/) - На этом занятии вы создадите тренировочную среду, которую будете использовать для выполнения практических заданий данного тренинга. Изучите файлы приложения. А также проверите, что приложение настроено правильно, протестировав его с помощью существующего ABL-клиента. Вы должны завершить это занятие прежде, чем приступить к заданиям следующего практического занятия. На выполнение всех заданий отводится примерно 30 минут. Занятие состоит - [Описание занятия](https://rupug.pro/lessons/описание-занятия/) - На этом занятии вы создадите клиента с графическим интерфейсом, с помощью которого через REST-сервис будут запрашиваться параметры сервера приложений PAS for OpenEdge. Затем вы измените параметры и отправите на сервере приложений для обновления используя REST. Практическое занятие состоит из четырёх заданий: Задание 1: Создание нового проекта Задание 2: Подготовка формы Задание 3: Извлечение данных Задание - [Описание занятия](https://rupug.pro/lessons/rest-38/) - На этом занятии вы создадите ABL-клиента для доступа к REST-сервису, который работает на сервере приложений PAS for OpenEdge. На сервере приложений развёрнуто приложение-менеджер oemanager. Клиент ABL должен будет извлечь из этого приложения свойства конфигурации PAS for OpenEdge. Дополнительно вы напишите код для базовой аутентификации и хранения куки. Практическое занятие состоит из семи заданий: Задание 1: - [Операции и операторы. Что нужно помнить](https://rupug.pro/lessons/operations-and-operators-things-to-remember/) - Приоритеты операций Операции ABL имеют следующие приоритеты (Таблица 2). Таблица 2. Приоритеты операций ABL Операция Приоритет Унарные -, + 7 MODULO, /, * 6 Бинарные -, + 5 BEGINS, MATCHES, , =, =, 4 NOT 3 AND 2 OR 1 Для изменения последовательности действий и улучшения читаемости следует использовать скобки. Неопределенное значение - [Однопользовательская и многопользовательская среды](https://rupug.pro/lessons/single-user-and-multi-user-environments/) - Каждая база данных OpenEdge может работать в одном из двух режимах: в однопользовательском или в многопользовательском. Однопользовательский режим В однопользовательском режиме только один пользователь может получить доступ к базе данных в конкретный момент времени, все другие пользователи будут блокироваться. Например, если вы как администратор базы данных подключаетесь к базе данных в однопользовательском режиме для изменения - [Ограничение клиент-серверных транзакций по HTTPS](https://rupug.pro/lessons/pasoe-dba-25/) - При создании экземпляра PAS for OpenEdge необходимо указать порты HTTP и HTTPS для этого экземпляра. Чтобы обеспечить шифрование всех транзакций между экземпляром и клиентом, необходимо: Запретить HTTP-доступ к экземпляру, отключив HTTP-порт. Для этого выполните следующую команду в каталоге bin экземпляра: tcman feature HTTP=off Добавить действительный сертификат Secure Sockets Layer (SSL) к экземпляру. Не используйте SSL-сертификат, - [Объединение секций](https://rupug.pro/lessons/merging-partitions/) - В некоторых случаях бывает необходимо объединить несколько небольших секций в одно большую секцию. К примеру, если: изначальный размер секции был сочтён слишком малым, и вы решили объединить эту секцию с какой-то другой секцией; необходимо периодически консолидировать устаревающие, наименее часто используемые секции. Также, как и при разделении, вы можете объединять только те секции, для которых применено - [Обработка состояний STOP и QUIT](https://rupug.pro/lessons/processing-stop-and-quit/) - Обработка состояния STOP Состояние STOP устанавливается программно, когда выполняется оператор STOP или когда оператор заголовка блока содержит фразу STOP-AFTER и превышен указанный тайм-аут. Состояние STOP также устанавливается автоматически, когда AVM обнаруживает невосстановимую ошибку, например, потеряно соединение с базой данных или не найдена вызываемая процедура. Состояние STOP также может быть установлено пользователем с клавиатуры, с помощью - [Обработка событий изменения](https://rupug.pro/lessons/prodataset-handling-change-events/) - Теперь вы знаете, как написать и использовать обработчики событий заполнения для наборов данных. Эти события происходят только на сервере и там же обрабатываются. Но события изменения могут происходить и на сервере, и на клиенте, соответственно и обрабатываются они там, где происходят. События изменений возникают, когда во временной таблице набора данных создаются, удаляются или изменяются записи. - [Обработка событий заполнения](https://rupug.pro/lessons/prodataset-processing-fill-events/) - Существует два типа событий заполнения: для набора данных и для буфера временной таблицы набора данных. Соответственно эти события автоматически возникают во время операций заполнения набора данных или временной таблицы. Для каждого из них можно написать собственный обработчик. В следующей таблице описаны события, которые срабатывают во время операции заполнения набора данных. Событие Когда возникает Возможное применение - [Обработка системных ошибок](https://rupug.pro/lessons/prodataset-handling-system-errors/) - Когда обновлённый набор данных отправлен на сервер для применения к базе данных, на сервере могут возникать системные ошибки. Поэтому необходим способ поиска и анализа этих ошибок, когда набор данных возвращается клиенту. Система устанавливает атрибут ERROR если обнаружит ошибку во время выполнения операций SAVE-ROW-CHANGES () или FILL. Атрибут ERROR устанавливается на трёх уровнях: Для конкретного буфера - [Обработка ошибок, связанных с данными в приложении](https://rupug.pro/lessons/prodataset-handling-errors-with-data-in-the-app/) - Вы можете обнаружить ошибки, связанные с данными в коде приложения на стороне сервера до того, как будет сделана попытка обновить базу данных. Например, если на клиенте поле получило новое значение, которое находится вне допустимого диапазона значений, то можно добавить код в приложение на стороне сервера, чтобы обнаружить ошибку. В этом случае для строки устанавливается атрибут - [Обработка ошибок в блоках CATCH](https://rupug.pro/lessons/handling-errors-in-catch-blocks/) - Оператор CATCH определяет блок обработки ошибок конкретного типа в определенном блоке. CATCH - Введение Структурная обработка ошибок позволяет Вам предоставить пользовательский код обработки ошибок для любого типа ошибок. В ABL для этого служит оператор CATCH. Оператор CATCH определяет конечный (end) блок кода, который исполняется только, если было установлено состояние ERROR в связанном блоке (связанный блок - [Обработка ответа](https://rupug.pro/lessons/rest-36/) - После возврата ответа вы можете получить доступ к данным, используя методы и свойства по умолчанию экземпляра OpenEdge.Net.HTTP.IHttpResponse. Свойство для доступа к коду статуса - StatusCode, а свойство для доступа к статусу ответа - StatusReason. Доступ к данным ответа можно получить с помощью свойства Entity, которое возвращает объект. Возвращаемый объект обычно является отформатированным (проанализированным) объектом, таким - [Обработка набора изменений на сервере](https://rupug.pro/lessons/prodataset-processing-dataset-changes-on-server/) - На стороне сервера доступ к динамическому набору изменений отличается от доступа к статическому набору данных. В динамическом наборе вы не можете получить доступ к временным таблицам и их полям по имени, вы должны обращаться к ним динамически. Следующий пример демонстрирует шаблон кода внутренней процедуры, в которой определён параметр с типом INPUT-OUTPUT и атрибутом DATASET-HANDLE, который - [Области хранения](https://rupug.pro/lessons/database-area/) - Одна из задач администратора заключается в управление физическими составляющими базы данных. Администратор должен следить за тем, чтобы база данных имела достаточно пространства для размещения имеющихся объектов базы данных и достаточно свободного пространства для расширения базы данных в будущем. На этом уроке вы узнаете о физических компонентах базы данных OpenEdge, о различных типах файлов базы данных, - [Области хранения](https://rupug.pro/lessons/tune/) - Области хранения – это логические наборы экстентов, представленных в виде физических файлов на дисковых носителях. Области хранения представляют собой самую большую единицу хранения в базе данных. Каждая области может состоять из одного или нескольких экстентов. Максимальное количество экстентов в области - 1024. Области хранения позволяют: разделить БД на разные области для повышения производительности и упрощения - [Области видимости записей](https://rupug.pro/lessons/record-scopes/) - Когда Вы выполняете обращение к таблице базы данных, и ABL делает запись этой таблицы доступной для использования, Вы фактически используете буфер записи. Progress создает буфер для каждой таблицы, на которую есть ссылка в операторах FIND или блоках FOR EACH, REPEAT, FOR или DO FOR. Имя буфера по умолчанию совпадает с именем таблицы. Буфер представляет собой - [Обзор приложения-примера, основанного на OERA](https://rupug.pro/lessons/sample-application-based-on-oera/) - «AutoEdge|TheFactory» – это приложение-пример, которое спроектировано с использованием принципов OERA с целью демонстрации возможностей ABL, включая объектно-ориентированное программирование, структурированную обработку ошибок и multi-tenancy, в том числе для демонстрации возможностей интеграции между собой различных продуктов из линейки Progress Software. Стоит отметить, что это приложение не является законченным решением, тем не менее, оно содержит достаточный набор реализованных - [Обзор задач табличного секционирования](https://rupug.pro/lessons/overview-of-table-partitioning-tasks/) - При работе с табличным секционированием в OpenEdge вы будете манипулировать следующими категориями задач: Задачи реализации табличного секционирования. Задачи администрирования секционированных таблиц. В следующих двух таблицах приведён полный их список. Таблица 1. Задачи реализации табличного секционирования Задача Описание Идентификация таблиц для секционирования Выбор таблиц для разделения на секции. Определение секционных столбцов, локальных и глобальных индексов. Выделение - [Обзор PASOE](https://rupug.pro/lessons/pas-introduction/) - Progress Application Server for OpenEdge (PAS for OpenEdge) – это один из двух серверов приложений, которые вы можете использовать для развёртывания ваших приложений. PAS for OpenEdge – это веб-сервер Apache Tomcat который был адаптирован для поддержки OpenEdge ABL. В дополнение к приложениям на OpenEdge ABL на этом сервере приложений можно разворачивать приложения REST, SOAP и - [Обзор AppServer (classic)](https://rupug.pro/lessons/appsrv-introduction/) - OpenEdge Application Server представляет собой классический сервер приложений, который является вторым вариантом для развёртывания приложений. Этот сервер приложений содержит классический AppServer для ABL-приложений, а также WebSpeed Transaction Server, предназначенный для WebSpeed-приложений доступных из Интернет. В этой статье мы сконцентрируемся на AppServer. В зависимости от клиента и конфигурации AppServer, клиент получает доступ к AppServer с помощью - [О приложении-примере](https://rupug.pro/lessons/rest-5/) - Во время этого тренинга вы будет работать с приложением-примером, которое называется CustomerOrderApp. Это простейшее ABL-приложение, с помощью которого создаются новые записи о клиентах, извлекаются клиентские записи, обновляется или удаляется существующая клиентская информация. С его помощью также можно извлечь клиентские заказы. Приложение работает с копией базы данных sports2000. Этот пример ABL-приложения мы преобразуем в веб-приложение REST. - [Настройка экземпляра](https://rupug.pro/lessons/pasoe-dba-6/) - Во время создания экземпляра PAS for OpenEdge его параметры автоматически устанавливаются на определённые значения по умолчанию. Каждый сервер приложений имеет собственный каталог /conf, который содержит различные конфигурационные файлы: openedge.properties – содержит настройки, необходимые для создания и работы экземпляра; catalina.properties – содержит настройки JAVA, которые использует экземпляр и его ABL Web-приложения; appserver.properties – настройки в этом - [Настройка упражнений](https://rupug.pro/lessons/настройка-упражнений/) - [Настройка сопоставления типов данных](https://rupug.pro/lessons/prodataset-configuring-data-type-mapping/) - Когда вы получаете XML-файлы из внешнего источника, у вас есть некоторая гибкость в том, как AVM сопоставляет типы данных XML-элемента и атрибута с типами данных ABL. В этой части показано, как настроить сопоставление типов данных для определенных полей. Существует два параметра, которые позволяют управлять сопоставлениями типов полей: override-default-mapping field-type-mapping Если вы используете XML-схему, созданную OpenEdge, - [Настройка сервера Apache HTTP](https://rupug.pro/lessons/pasoe-dba-29/) - Настройка сервера Apache HTTP для балансировки нагрузки на основе Tomcat включает в себя: Активацию протокола APJ13 для коммуникации с балансировщиком нагрузки. Связывание с балансировщиком нагрузки. Для активации протокола APJ13 раскомментируйте следующие модули в файле httpd.conf сервера HTTP: LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so Чтобы сослаться на балансировщик нагрузки, добавьте следующие определения в файл httpd.conf: #workers.properties - [Настройка перспектив](https://rupug.pro/lessons/pdsoe-14/) - В процессе разработки вам может потребоваться поделиться кодом с другими разработчиками, управлять проектами в рабочей области, а также управлять процессами сервера OpenEdge из среды Developer Studio. Кроме того, вы можете захотеть настроить вид Developer Studio под свои предпочтения. Далее вы узнаете, как: настроить отображение ресурсов в Developer Studio; создать архив проекта; удалить файлы или проекты - [Настройка переменных среды окружения](https://rupug.pro/lessons/pasoe-dba-27/) - Некоторые приложения, развёртываемые на экземпляре PAS for OpenEdge, могут требовать установки определенных переменных среды. Эти переменные должны быть установлены каждый раз, когда запускается экземпляр PAS for OpenEdge. Для классического OpenEdge AppServer вы должны были установить эти переменные в файле ubroker.properties. Чтобы установить переменные среды для экземпляра PAS for OpenEdge, необходимо создать файл *_setenv.bat (или файл - [Настройка параметра Spin Lock Retries с помощью VST](https://rupug.pro/lessons/tune-33/) - Изменить значение параметра Spin Lock Retries (-spin) можно с помощью виртуальных системных таблиц (VST). Значение параметра -spin хранится в виртуальной системной таблице _DbParams, которая содержит следующие ключевые поля: _DbParams-Name (Character) – название параметра; _DbParams-Value (Character) – значение параметра. Следующий ABL-код выполняет поиск параметра -spin в таблице _DbParams в работающей базе данных и устанавливает значение параметра - [Настройка параметра Spin Lock Retries в PROMON](https://rupug.pro/lessons/tune-32/) - По умолчанию параметр Spin Lock Retries (-spin) имеет значение равное 6000 умноженное на количество процессоров в системе. Например, если на компьютере установлено четыре процессора, то по умолчанию параметр -spin будет иметь значение 24 000. Если обнаружено, что значение метрики Latch timeouts выше допустимых показателей, то необходимо увеличить значение -spin чтобы уменьшить показатели Latch timeouts и - [Настройка OpenEdge Management при первом запуске](https://rupug.pro/lessons/setting-up-openedge-management-on-first-launch/) - Как отмечалось ранее, во время первого запуска OpenEdge Management необходимо выполнить некоторую первоначальную настройку. При первом запуске OpenEdge Explorer в веб-браузере откроется страница OpenEdge Explorer Configuration, на которой необходимо указать: Пароль администратора. Параметры автостарта. Порт веб-сервера. При первом запуске OpenEdge Management в веб-браузере откроется страница OpenEdge Management Configuration, на которой необходимо указать: Пароль администратора. Параметры - [Настройка Developer Studio для управления серверами приложений](https://rupug.pro/lessons/pdsoe-17/) - По мере развития вашего приложения вам, скорее всего, потребуется выполнять отдельные его части на сервере приложений. В Developer Studio можно настраивать серверы приложений и управлять ими. Кроме того, вы можете развернуть ABL-код в виде сервиса, работающего на сервере приложений. Всё это позволяет протестировать ваше приложение так, как оно работало бы в производственной среде. Для управления - [Назначение тренинга](https://rupug.pro/lessons/purpose-of-the-course/) - Данный тренинг предназначен для разработчиков программного обеспечения (ПО), использующих платформу OpenEdge для создания и сопровождения информационных бизнес-систем. Предполагается, что участник тренинга имеет некоторый опыт работы с OpenEdge, или, по крайней мере, знаком с базовыми основами программирования на ABL (на сегодня единственный известный автору базовый курс по программированию на ABL на русском языке – это курс - [Мониторинг экстентов (PROSTRCT STATISTICS)](https://rupug.pro/lessons/monitoring-of-extents-prostrct-statistics/) - В качестве альтернативы OpenEdge Management для мониторинга экстентов можно воспользоваться утилитой командной строки prostrct statistics. Утилита показывает различного рода информацию, в том числе: Размер блока базы данных. Количество активных блоков, используемых в каждой области. Размеры всех экстентов. Но, в отличии от OpenEdge Management, утилита prostrct statistics не показывает использование областей в процентном соотношении. Поэтому необходимо - [Мониторинг экстентов (OpenEdge Management)](https://rupug.pro/lessons/extent-monitoring-oemanagement/) - СУБД OpenEdge предоставляет два инструмента для мониторинга экстентов базы данных – консоль OpenEdge Management и утилиту командной строки prostrct statistics. При мониторинге экстентов базы данных важно следовать рекомендациям: Избегайте записи данных в экстенты переменного размера. Экстенты переменного размера предназначены для подстраховки, чтобы поймать момент, когда последний фиксированный экстент переполнится из-за всплеска количества сохраняемых данных в - [Мониторинг с помощью TCMAN](https://rupug.pro/lessons/pasoe-dba-39/) - Как упоминалось ранее, вы можете использовать TCMAN локально, чтобы получить базовую информацию о среде PAS for OpenEdge. Вы можете использовать команды TCMAN ENV и TCMAN PLIST для просмотра основных сведений о среде экземпляра и получения идентификаторов текущих запущенных процессов. Выполните следующую команду в каталоге bin экземпляра, чтобы просмотреть сведения об окружающей среде экземпляра: tcman env - [Мониторинг с помощью JConsole](https://rupug.pro/lessons/pasoe-dba-38/) - Инструмент JConsole позволяет выполнять мониторинг PAS for OpenEdge как локально, так и удалённо. Для локального использования JConsole необходимо: Определить PID процесса экземпляра PAS for OpenEdge с помощью TCMAN LIST. Двойным щелчком мыши по файлу jconsole.exe из каталога \bin инсталляции JDK. Откроется окно Java Monitoring & Management Console. Выберите Local Process. Выберите PID, который представляет экземпляр - [Мониторинг с использованием REST API](https://rupug.pro/lessons/pasoe-dba-35/) - Перед тем как начать использовать REST API для мониторинга экземпляра PAS for OpenEdge необходимо сделать следующее: Опубликовать приложение OpenEdge manager на экземпляре. Изменить пароль по умолчанию. Активировать доступ к фреймворку Swagger UI для спецификации RESTful API (OpenEdge7.4 и выше). Выполнить рестарт сервера приложений. Публикация приложения OpenEdge manager Для публикации приложения OpenEdge manager на экземпляре PAS - [Мониторинг ожиданий локировок и ресурсов](https://rupug.pro/lessons/tune-37/) - Некоторые узкие места в производительности могу быть не связаны с базой данных, а обусловлены ограничениями программного кода приложения. Администратор может выполнять мониторинг ожиданий локировок и ресурсов для идентификации потенциальных узких мест, вызванных приложением. Ожидания локировок и ресурсов являются показателями производительности для клиентских процессов, которые пытаются получить доступ к разделяемой памяти. Ожидания локировок (Lock waits) указывают - [Мониторинг latch timeouts с помощью PROMON](https://rupug.pro/lessons/tune-30/) - Мониторинг метрики Latch timeouts может быть выполнен с помощью утилиты PROMON, где показатели Latch timeouts отображаются в виде общего значения за период времени выборки, за минуту, за секунду и за транзакцию. Следующие действия описывают процесс мониторинга latch timeouts в PROMON: Открыть Proenv. Перейти в каталог с базой данных. Запустить PROMON для работающей базы данных: promon - [Мониторинг latch timeouts в OpenEdge Management](https://rupug.pro/lessons/tune-31/) - Мониторинг метрики Latch timeouts можно выполнять с помощью OpenEdge Management. В отличии от PROMON, который отображает информацию за весь период выборки, за минуту, за секунду и за транзакцию, OpenEdge Management показывает общее количество Latch timeouts по разным категориям, таким как латчи очереди транзакций или латчи цепочки буферного пула (LRU). Больше информации о категориях можно найти - [Механизмы восстановление базы данных после аварий](https://rupug.pro/lessons/database-recovery-after-accidents/) - СУБД OpenEdge предлагает три способа восстановления базы данных после аварий. Далее они описаны в порядке повышения уровня доступности базы данных и стоимости реализации. Roll-forward Recovery Roll-forward Recovery – это процесс, в котором используется комбинация из резервных копий базы данных и соответствующих файлов After-Imaging для минимизации объёма потерянных данных. В случае сбоя в базе данных или - [Методы создания баз данных](https://rupug.pro/lessons/database-creation-methods/) - Мы подошли к более интересной части этого урока – к созданию баз данных. Для создания баз данных OpenEdge используются утилиты: prodb – самый простой и быстрый способ создания баз данных OpenEdge. Утилита обычно используется разработчиками для создания баз данных с целью тестирования приложений. prostrct create – эта утилита предоставляет администратору полный контроль над процессом создания - [Краткое описание урока](https://rupug.pro/lessons/brief-description-of-the-lesson-3/) - Вы обязательно столкнётесь с необходимостью секционирования существующих таблиц в базе данных. Кроме того, при выполнении операций секционирования для таких таблиц вам нужно будет минимизировать время простоя. Ниже мы рассмотрим способы, как это сделать. Способ секционирования существующих таблиц аналогичен способу, применяемому к новым таблицам. На этом уроке вы узнаете, как секционировать существующие таблицы с помощью инструментария - [Краткое описание урока](https://rupug.pro/lessons/brief-description-of-the-lesson-2/) - На прошлом уроке вы научились выполнять следующие задачи для реализации OpenEdge Table Partitioning: Идентифицировать таблицы для секционирования. Выделять пространство для хранения секционированных таблиц. Активировать табличное секционирование в базе данных. Во время выбора таблиц для секционирования может случиться так, что по каким-либо причинам вам необходимо создать новые секционированные таблицы с нуля. В СУБД OpenEdge существует три - [Краткое описание урока](https://rupug.pro/lessons/brief-description-of-the-lesson-6/) - Утилита анализа БД предоставляет информацию о том, как распределены таблицы и индексы (в том числе и секционированные) в разных областях хранения базы данных OpenEdge RDBMS. Необходимо собирать такую статистику регулярно и хранить её для анализа изменений БД. Такой подход поможет вам в дальнейшей настройке базы данных в части улучшения производительности, а также позволит планировать необходимые - [Краткое описание урока](https://rupug.pro/lessons/brief-description-of-the-lesson-5/) - С появлением Table Partitioning в СУБД OpenEdge были введены два типа индексов: глобальные и локальные индексы. Глобальный индекс содержит индексные ключи для всех строк во всех секциях таблицы. Такие индексы полностью идентичны индексам обычной, несекционированной таблицы. Когда в секции таблицы выполняются операции CREATE, UPDATE и DELETE, то обновление глобального индекса происходит автоматически. При добавлении, разделении, - [Краткое описание урока](https://rupug.pro/lessons/brief-description-of-the-lesson-4/) - На прошлых уроках вы научились создавать новые секционированные таблицы и секционировать уже существующие. Но с течением времени требования к данным могут изменяться, что в свою очередь может потребовать от вас выполнения следующих задач: Добавление новых секций в таблицу для размещения новых данных. Изменение имён некоторых секций. Некоторые секции, размер которых изначально казался приемлемым, могут стать - [Краткое описание урока](https://rupug.pro/lessons/brief-description-of-the-lesson-1/) - На этом уроке вы познакомитесь с особенностями и преимуществами Progress OpenEdge Table Partitioning, узнаете о понятиях и типах табличного секционирования, изучите консоль администрирования баз данных, узнаете, с какими задачами вы столкнётесь во время внедрения и администрирования табличного секционирования в OpenEdge. И наконец, вы разберётесь, как выполнить первые три задачи, заключающиеся в идентификации таблицы для секционирования, - [Краткий обзор задач безопасности](https://rupug.pro/lessons/security/) - Если в OpenEdge-приложении реализован слой, отвечающий за безопасность, то администратор несёт ответственность за настройку шлюза аутентификации OpenEdge (OpenEdge Authentication Gateway) – Progress реализацию Security Token Service (STS) совместно с экземпляром PAS for OpenEdge и базой данных. STS обращается к службе каталогов пользователей на уровне предприятия (например, LDAP) для аутентификации пользователей, после чего создаёт токены безопасности - [Копирование дополнительных файлов](https://rupug.pro/lessons/copying-additional-files/) - Кроме копирования обязательных файлов базы данных утилитой probkup для обеспечения полноценного восстановления, необходимо создать резервную копию дополнительных файлов. Таким файлами являются: структурный файл базы данных (.st); журнал базы данных (.lg); хранилище ключей, если включено шифрование данных (.ks); файлы After-Imaging; настройки серверов приложений (ubroker.properties, conmgr.properties, *.repl.properties); файлы параметров старта базы данных и клиентских сессий (.pf); скрипты - [Концепция UNDO](https://rupug.pro/lessons/concept-of-undo/) - Операция UNDO в ABL гарантирует, что незавершенные изменения постоянных данных (полей в записях базы данных) не будут записаны в базу данных при возникновении состояния ERROR или STOP. Так как язык ABL является ориентированным на транзакции, такой набор незавершенных изменений, по сути, эквивалентен текущей активной транзакции. Операция UNDO, другими словами, откатывает текущую транзакцию. ABL распространяет защиту - [Консоль администрирования баз данных](https://rupug.pro/lessons/database-administration-console/) - Перед тем, как продолжить изучение OpenEdge Table Partitioning необходимо познакомиться с консолью администрирования баз данных OpenEdge – Database Administration Console. Консоль администрирования баз данных является частью OpenEdge Explorer и OpenEdge Management и представляет собой предназначенный для настройки и управления OpenEdge-средой веб-интерфейс, в частности для управления табличным секционированием. Следующий список, представляет набор возможностей консоли администрирования в - [Компоненты архитектуры](https://rupug.pro/lessons/components-architectures/) - Для эффективного администрирования баз данных необходимо понимать архитектуру СУБД Progress OpenEdge. На этом уроке вы узнаете о ключевых компонентах архитектуры и о том, как они взаимодействуют между собой для обеспечения работы базы данных. Графическое представление архитектуры СУБД OpenEdge Описание компонент: Disk-Resident Database - набор физических файлов операционной системы и логических структур хранения, которые содержат постоянные - [Количество записей в блоке](https://rupug.pro/lessons/tune-10/) - Количество записей в блоке (далее RPB, Records Per Block) – это допустимое количество записей в каждом блоке области хранения. В области хранения схемы (Schema Area) значение RPB фиксировано и зависит от размера блока базы данных: 32 для размера блока 1 Кб, 2 Кб и 4Кб; 64 для размера блока 8 Кб. Для областей с данными - [Кластеры](https://rupug.pro/lessons/tune-9/) - Для улучшения производительности в областях второго типа СУБД OpenEdge оперирует такой единицей хранения как кластер. Кластер представляет собой последовательность блоков базы данных, которые содержат данные единственного объекта – таблицы, индекса, BLOB (Binary Large OBject) или CLOB (Character Large OBject). Кластеры могут содержать 8, 64 или 512 блоков базы данных. Размер кластера фиксирован в пределах одной - [Итоги курса](https://rupug.pro/lessons/summary-2/) - На этом курсе вы получили и закрепили общие представления о работе со средой разработки Progress Developer Studio for OpenEdge – это были первые ваши шаги в мире возможностей платформы OpenEdge. Также вы познакомились с Progress OpenEdge Reference Architecture (OERA), научились различать её слои и компоненты, а также разобрались в их взаимосвязях. У нас не было - [Исправление логических повреждений в индексе](https://rupug.pro/lessons/fixing-logical-corruption-in-the-index/) - С течением времени локальные индексы могут быть повреждены по разным причинам, включая ошибки приложений, ошибки системного программного обеспечения или ошибки на уровне аппаратного обеспечения. Повреждённый индекс может не проявлять себя в течение длительного периода времени, пока пользователи не столкнутся с соответствующими сообщениями об ошибках, указывающих на индексное повреждение. Следовательно, в ваши обязанности должен входить периодический - [Использование наборов данных в распределённой среде](https://rupug.pro/lessons/prodataset-in-a-distributed-environment/) - Использование наборов данных в распределённой среде предполагает передачу набора данных из одной процедуры в другую. Из этой части вы узнаете об одной из самых мощных функций набора данных - его способности транспортироваться или «маршализироваться» между процедурами. Передача набора данных в качестве параметра позволяет перемещать сложные наборы данных между сервером и клиентом, из процедуры в процедуру - [Использование классов ошибок](https://rupug.pro/lessons/the-use-of-error-classes/) - Основной характеристикой структурной обработки ошибок является представление ошибок как объектов. Рассмотрим интерфейс и четыре класса, представляющие объекты ошибок ABL. Это не требует серьезных знаний по объектно-ориентированному программированию. Для использования структурной обработки ошибок не требуется объектно-ориентированный подход к разработке приложения. Основные механизмы структурной обработки ошибок тесно связаны с традиционной обработкой ошибок и могут быть применены в - [Использование блоков FINALLY](https://rupug.pro/lessons/the-use-of-finally-blocks/) - Конечные блоки FINALLY обеспечивают обработку окончания блока для базовых блоков ABL. Эта обработка выполняется на каждой итерации блока, даже если эта итерация привела к ошибке. Введение В объектно-ориентированном программировании, «очищающий» код, удаляющий ненужные объекты и освобождающий ресурсы, является жизненно важным. Оператор FINALLY поддерживает выполнение этой задачи. Оператор FINALLY создает конечный блок, который исполняется каждый раз - [Использование альтернативных имён в XML](https://rupug.pro/lessons/prodataset-using-alternative-names-in-xml/) - Вам может потребоваться преобразовать имена набора данных, временных таблиц или полей при их записи в XML-документ. Особенно если их имена являются ключевыми словами или содержат запрещённые символы для имён ABL. Поэтому вам нужен простой способ решить эту задачу. ABL предоставляет возможность присвоения альтернативных имён элементам ABL, которые используются при сериализации данных и схемы ABL в - [Использование PROUTIL IDXBUILD](https://rupug.pro/lessons/using-proutil-idxbuild/) - После того как в новую базу данных были загружены описания данных, содержимое таблиц и значения секцвенций, необходимо выполнить переиндексацию базы данных с помощью утилиты PROUTIL IDXBUILD в офлайн. Для выполнения переиндексации вы должны выполнить три основных действия: Остановить базу данных. Создать резервную копию базы данных. В утилиту PROUTIL IDXBUILD не встроен процесс восстановления после сбоев - [Интерпретация вывода XML](https://rupug.pro/lessons/prodataset-interpreting-xml-output/) - Вам не нужно знать подробности о форматировании или создании XML-документа. Предоставьте это автоматизированным XML-функциям в ABL. Однако необходимо знать базовую структуру XML-файла, чтобы можно было читать и интерпретировать выходные данные XML из метода WRITE-XML. В этой части мы рассмотрим базовые элементы XML на основе сформированного методом WRITE-XML примера XML-файла. Если вы уже знакомы с форматом - [Инструменты настройки производительности](https://rupug.pro/lessons/tune-4/) - В СУБД OpenEdge существует три инструмента, которые можно использовать для мониторинга и настройки производительности работающей базы данных... - [Инструменты администрирования](https://rupug.pro/lessons/appsrv-administrative-tool/) - AppServer-администратор отвечает за: Создание и конфигурирование свойств AppServer. Старт, останов и удаление AppServer. Мониторинг и управление сервером приложений. Реализацию балансировки нагрузки и отказоустойчивости AppServer. Настройку безопасности – SSL, пользовательская аутентификация. СУБД OpenEdge предоставляет ряд инструментов для администрирования AppServer: ASBMAN: утилита командной строки, которая используется для создания, конфигурирования, старта и останова, а также для управления сервером - [Инструменты администрирования](https://rupug.pro/lessons/pas-administrative-tool/) - Администратор сервера приложений PAS for OpenEdge отвечает за: Создание и настройку экземпляра PAS for OpenEdge. Развёртывание кода ABL, REST, SOAP и/или WebSpeed приложений на экземпляре. Старт, останов и удаление экземпляра. Развёртывание приложений менеджеров (Tomcat manager, OpenEdge manager). Мониторинг и управление экземплярами. Реализацию балансировки нагрузки для PAS for OpenEdge. Настройку безопасности – HTTPS, пользовательская аутентификация. СУБД - [Инструменты администрирования](https://rupug.pro/lessons/administration-tools/) - Администратор базы данных отвечает за: создание и настройку базы данных; старт и останов базы данных; резервное копирование и восстановление базы данных; реализацию процесса восстановления с повтором транзакции на основе After-Imaging; выгрузку и загрузку данных в базу; мониторинг, управление и тюнинг базы данных. СУБД предоставляет несколько инструментов, которые могут использоваться для решения административных задач: Инструмент командной - [Инструкция по подготовке тестовой среды](https://rupug.pro/lessons/instructions-for-preparing-the-test-environment/) - Это практическое занятие состоит из трёх заданий: Создание базы данных и выделение пространства для секций. Настройка базы данных в качестве управляемого ресурса OE Management. Активация OpenEdge Table Partitioning в работающей базе данных. Перед тем как приступить к выполнению заданий, вам необходимо: Установить минимальный набор продуктов OpenEdge5: или OpenEdge Enterprise RDBMS OpenEdge Table Partitioning OpenEdge Management - [Изменение файла описания данных](https://rupug.pro/lessons/change-data-definitions/) - После создания файла описания данных его можно открыть и просмотреть содержимое. Файл описания данных (.df) – это текстовый файл, который содержит описание таблиц, полей, индексов и секвенций в базе данных. Описания этих объектов базы данных состоит из различных свойств и их значений. Например, описание секвенций содержит такие свойства как INITIAL, INCREMENT, CYCLE-ON-LIMIT и MIN-VAL. Когда - [Изменение свойств экземпляра](https://rupug.pro/lessons/pasoe-dba-22/) - Напомним, что свойства конфигурации экземпляра PAS for OpenEdge распределены по нескольким файлам. И хотя вы можете вручную редактировать файл свойств, рекомендуется использовать специальные инструменты для их просмотра и редактирования. Для редактирования и просмотра… используйте… openedge.properties OEPROP catalina.properties TCMAN CONFIG appserver.properties TCMAN CONFIG jvm.properties TCMAN CONFIG server.xml TCMAN FEATURE После того как вы создали экземпляр PAS - [Изменение настроек рабочего пространства](https://rupug.pro/lessons/pdsoe-03/) - Новое рабочее пространство не содержит каких-либо проектов, но перед их созданием или импортированием можно изменить несколько параметров рабочего пространства. Поскольку рабочее пространство представляет собой контейнер для проектов, то многие настроенные для него параметры, наследуется проектами. Параметры рабочего пространства находятся в основном меню Window > Preferences, как показано на скриншоте. По умолчанию рабочее пространство использует предварительно - [Изменение данных клиентом](https://rupug.pro/lessons/prodataset-change-data-by-client/) - Всякий раз, когда клиент создаёт, удаляет или изменяет записи в своей локальной копии рабочего набора данных, он должен убедиться, что изменения, вносимые в набор данных, помечаются как обновления в таблице BEFORE. Набор изменений, который подготавливает клиент должен содержать все записи из таблицы BEFORE и все обновлённые записи таблицы AFTER. Сервер использует эти записи для применения - [Изменение данных в наборе](https://rupug.pro/lessons/prodataset-change-dataset/) - После того как набор данных был получен с сервера клиент может внести в него изменения и передать их обратно на сервер. Однако поскольку набор данных часто представляет собой набор записей в нескольких таблицах, то процесс обновления может быть более сложным, чем обновление отдельной таблицы. При написании клиентского кода, который обновляет набор данных, оперируют двумя типами - [Идентификация таблиц для секционирования](https://rupug.pro/lessons/identifying-tables-for-partitioning/) - Для правильного выбора таблицы, которая будет разделена на секции, вам необходимо провести некоторый анализ. Необходимо понимать, как логически спроектирована база данных и как она используется приложением. Так как таким знанием обладают и разработчики, то вы должны работать с ними в тесном контакте. Обязательно нужно получить ответы на следующие вопросы: Какие из самых больших таблиц в - [Зеркалирование дисков](https://rupug.pro/lessons/disk-mirroring/) - Если на уровне операционной системы используется зеркалирование дисков для обеспечения избыточности данных в рамках корпоративной стратегии резервного копирования и восстановления, то можно выполнить полное резервное копирование базы данных OpenEdge в онлайн, используя комбинацию так называемых «тихих точек» базы данных (database quiet points) и технологию зеркалирование дисков. Когда в базе данных активирована «тихая точка», транзакционная активность - [Заполнение набора данных](https://rupug.pro/lessons/prodataset-filling/) - После описания набора данных и его источников следующим шагом будет заполнение его данными. Набор данных всегда заполняется кодом серверной части приложения. Самый простой и эффективный способ заполнения – это использование метода FILL. Метод FILL не только заполняет набор данных из подключённых источников данных, но также координирует загрузку данных и поддерживает целостность связей. В одиночной операции - [Заполнение ProDataSet из файла XML](https://rupug.pro/lessons/prodataset-filling-from-xml-file/) - Взаимодействие с внешними приложениями и источниками данных, как правило, происходит в двух направлениях: Запись содержимого ProDataSet и схемы в формате XML и отправку результата получателю для чтения. Получение от сторонних приложений, чтение и сохранение данных XML и схемы в ProDataSet. В этой части мы рассмотрим, как происходит чтение XML и сохранение в наборах данных OpenEdge. - [Запись описания набора данных в XML](https://rupug.pro/lessons/prodataset-writing-a-definition-of-a-dataset-in-xml/) - Для обмена данными в форме XML-документов отправляющая и принимающая стороны должны согласовать формат XML-документа. Этот формат называется схемой XML. Схема описывает, как интерпретировать данные (элементы и атрибуты) XML-документа. Как правило, отправляющая сторона создаёт и отправляет её принимающей стороне. Приложения OpenEdge имеют два метода публикации XML-схемы. Методы WRITE-XML и WRITE-XMLSCHEMA могут преобразовывать определения временной таблицы и - [Запись набора данных в файл JSON](https://rupug.pro/lessons/prodataset-write-to-json/) - Для записи данных из набора данных в объект JSON используется дескриптор (handle) набора данных и встроенные метод WRITE-JSON(), который выполняет следующие действия: Открывает файл JSON. Добавляет имена набора данных и первой временной таблицы в объект JSON. Перебирает все записи первой временной таблицы и добавляет каждую запись в объект JSON. Записывает следующее имя временной таблицы в - [Запись данных ProDataSet в XML](https://rupug.pro/lessons/prodataset-writing-in-xml/) - Данные из временных таблиц и наборов данных могут быть записаны в документ XML с помощью ABL-метода WRITE-XML. Кроме того, с помощью метода WRITE-XML вы можете записать и схему. Однако пока мы предполагаем, что отправляющая и принимающая стороны ранее согласовали и обменялись схемой. Поэтому о записи XML-схемы вы узнаете позже. Использование XML-функций в ABL обеспечивает взаимодействие - [Запись данных before-image в файл XML](https://rupug.pro/lessons/prodataset-writing-before-image-data-to-xml/) - Во время работы приложения может потребоваться включить изменения, внесённые в ProDataSet, в XML-файл, который отправляется другому приложению. Параметр write-before в методе WRITE-XML позволяет добавлять данные before-image в XML-файл. Вы уже знаете, как определить before-table как часть описания временной таблицы, например: DEFINE TEMP-TABLE ttOrderLine NO-UNDO BEFORE-TABLE ttOrderLineBefore. Так же вы научились как указать какие изменения вы - [Запись XML из нескольких наборов данных](https://rupug.pro/lessons/prodataset-writing-xml-from-multiple-data-sets/) - Мощные возможности ProDataSets приходят от способности собрать и представить данные от множественных источников. ProDataSet может включать данные из нескольких баз данных и внешних источников. Если вы объединяете данные из разных источников в один ProDataSet, то у вас могут быть разные временные таблицы с одинаковым именем. Но поскольку в одном ProDataSet не может быть двух временных - [Задачи, связанные с использованием сервисов REST из ABL](https://rupug.pro/lessons/rest-29/) - Разработка на ABL для доступа к REST-сервисам предполагает выполнение следующих задач: Создание клиента HTTP. Создание URI. Создание запроса. Выполнение запроса. Обработка ответа. Перед тем, как приступить к реализации этих задач, вы должны добавить в PROPATH две процедурные библиотеки OpenEdge.Net.pl: C:\Progress\OpenEdge\src\netlib C:\Progress\OpenEdge\tty\netlib Клиентские библиотеки HTTP используют шаблоны конструктора для помощи в создании HTTP-клиента, HTTP-клиентской библиотеки, HTTP-запроса, - [Задачи OpenEdge Management/Explorer](https://rupug.pro/lessons/tasks-openedge-management-explorer/) - OpenEdge Explorer позволяет выполнять следующие задачи: Добавлять ресурсы базы данных. Устанавливать или изменять свойства баз данных. Стартовать или останавливать базы данных. Просматривать статус баз данных в реальном времени. Просматривать журнал (лог) базы данных. Работать с базами данных, в которых включён механизм Multi-tenant tables. Настраивать и использовать конфигурации баз данных и конфигурации серверных групп баз данных. - [Задание 7: Выполнение процедурного файла](https://rupug.pro/lessons/rest-45/) - В этом задании вы выполните файл процедуры ClientREST.p. Затем откроете файлы test.json и cookies.txt для просмотра данных JSON и файлов cookie. Правой кнопкой мыши щёлкните по любой секции файла ClientREST.p и выберите пункт меню Run as Progress OpenEdge Application. В Project Explorer дважды щёлкните по файлу test.json, чтобы открыть его в редакторе. Вы должны увидеть - [Задание 6: тестирование REST-сервиса с помощью REST-клиента](https://rupug.pro/lessons/rest-25/) - В этом задании вы выполните тестирование опубликованного REST-сервиса с помощью любого свободно доступного REST-клиента. Далее я буду использовать "Boomerang - SOAP & REST Client". Открываем REST-клиента: Запрос полного списка клиентов Укажем заголовок Headers: application: application/json Выбираем метод GET и в поле Request URL вводим следующий URI: http://localhost:8810/rest/CustomerOrderAppService/Customers Отправляем запрос по кнопке SEND. Вы должны получить - [Задание 6: Обработка ответа](https://rupug.pro/lessons/rest-44/) - В этом задании вы обработаете полученный ответ и сохраните его в текстовом файле. Затем сохраните куки в файл. Добавьте оператор using для включения библиотеки Progress.Json.ObjectModel.JsonObject в файл процедуры. Добавьте следующий код в файл процедуры в блоке Definitions: using Progress.Json.ObjectModel.JsonObject. Добавьте код, чтобы проверить, является ли код состояния 200 или нет. Если код состояния не 200, - [Задание 6. Удаление секций](https://rupug.pro/lessons/task-6-deleting-partitions/) - Выполнить усечение и удаление секций с данными до 1995 и 1999 годов. В каталоге C:\OpenEdge\WRK\tablepartitioning создайте каталог dump и перейдите в него в PROENV. Выполните многопоточную бинарную выгрузку данных из секций Order_1995 и Order_1999 в текущий рабочий каталог: proutil ..\sportsco -C dump order . partition order_1995 -thread 1 -threadnum 3 proenv>proutil sportsco -C dump order - [Задание 5: тестирование приложения-примера с помощью ABL-клиента](https://rupug.pro/lessons/rest-11/) - В этой части вы протестируете приложение CustomerOrderApp с помощью клиента ClientCustomerOrderApp чтобы убедиться в правильности настройки приложения и его готовности к представлению в виде веб-приложения REST. Убедитесь в том, что экземпляр сервера приложений oepas1 стартован. Если это не так, то выполните его старт. В Developer Studio раскройте проект ClientCustomerOrderApp и затем раскройте подкаталог src. Откройте - [Задание 5: публикация REST-сервиса сервере приложений](https://rupug.pro/lessons/rest-24/) - В этом задании необходимо опубликовать созданный REST-сервис на экземпляре PAS for OpenEdge, который был создан по умолчанию во время инсталляции Developer Studio. Выполните экспорт CustomerOrderAppService в качестве пакета REST-приложения: В окне Project Explorer щёлкните правой кнопкой мыши по CustomerOrderAppService в узле Define Services и выберите пункт Export. Выберите Export services for incremental deployment. В поле - [Задание 5: Выполнение запроса](https://rupug.pro/lessons/rest-43/) - В этой части вы сначала опишите переменную типа IHttpResponse. Затем выполните запрос, созданный в предыдущей части, и назначите ответ для описанной переменной. Опишите переменную oResponse типа IHttpResponse в блоке Preprocessor Definitions: define variable oResponse as IHttpResponse no-undo. Создайте экземпляр типа IHttpResponse, используя класс ResponseBuilder, и присвойте его к oResponse в блоке Main block: oResponse = - [Задание 5. Перемещение секций](https://rupug.pro/lessons/task-5-moving-partitions/) - Переместим все секции с данными до 2015 и 2019 годов и все их индексы в области хранения OrderData2 и OrderIndex2. Перемещение секции Order_2015 и связанных с ней индексов в области OrderData2 и OrderIndex2: proutil sportsco -C tablemove order orderdata2 orderindex2 partition order_2015 proenv>proutil sportsco -C tablemove order orderdata2 orderindex2 partition order_2015 OpenEdge Release 12.0 as - [Задание 5. Активация локальных индексов](https://rupug.pro/lessons/task-5-activation-of-local-indices/) - В этом задание необходимо создать неактивный локальный индекс для таблицы Customer и затем активировать их для первых трёх секций. Откройте инструментарий Data Dictionary: Start -> All Programs -> Progress -> OpenEdge -> Data Dictionary. Подключитесь к базе данных sportsco в многопользовательском режиме. Создайте неактивный индекс с именем CountrySalesrepCustnumLocalIdx в таблице Customer на основе столбцов Country, - [Задание 4: сопоставление HTTP-запросов c параметрами ответов](https://rupug.pro/lessons/rest-23/) - В этом задании с помощью REST Resource URI Editor необходимо связать параметры REST-запросов c входными параметрами ABL, а параметры REST-ответов c выходными параметрами ABL для каждой связанной ABL-операции. Для ресурса /Customers создайте правило сопоставления для операции ReadAll класса Customer.cls с методом GET: Выделите /Customer из списка ресурсов и метод GET из списка Verb Association. В - [Задание 4: Создание запроса](https://rupug.pro/lessons/rest-42/) - В этом задании вы создадите экземпляр класса Credentials, который содержит учётные данные пользователя PAS for OpenEdge, затем создадите запрос. Опишите переменную oCredentials типа Credentials в блоке Preprocessor Definitions: define variable oCredentials as Credentials no-undo. Опишите переменную oRequest типа IHttpRequest в блоке Preprocessor Definitions: define variable oRequest as IHttpRequest no-undo. Создайте экземпляр учетных данных, используя следующие - [Задание 4: Отправка данных](https://rupug.pro/lessons/rest-49/) - Теперь добавим код для обновления свойств конфигурации сервера приложений с помощью метода PUT. Использование метода PUT очень похоже на использование метода GET. Отличие в том, что с методом GET мы не передаём какую-то дополнительную нагрузку, но при использовании PUT мы должны отправить на сервер некоторую информацию. Перейдите на форму и щёлкните два раза по кнопке - [Задание 4: модули и файлы приложения-примера](https://rupug.pro/lessons/rest-10/) - В этой части вы рассмотрите приложение-пример CustomerOrderApp. Приложение содержит файлы процедур и файлы классов. В следующих разделах тренинга вы узнаете, как представить эти ABL-операции в качестве REST-операций. Приложение пример содержит два проекта: CustomerOrderApp и ClientCustomerOrderApp. Проект CustomerOrderApp содержит бизнес-логику и код, выполняющий CRUD (Create, Read, Update и Delete) операций. Проект ClientCustomerOrderApp содержит код ABL-клиента для - [Задание 4. Создать read-only секции](https://rupug.pro/lessons/task-4-create-a-read-only-partitions/) - Изменить статус доступа к данным в секциях за 2005 и 2009 года на read-only. В первую очередь необходимо активировать эту возможность. На странице Database Administration для базы данных sportsco в секции Database Features щёлкните по Enable напротив Read-only Partitions. На открывшейся странице щёлкните по Enable read-only partitions и затем щёлкните Ok: Примечание: начиная с OpenEdge - [Задание 4. Перемещение существующих данных в секции](https://rupug.pro/lessons/task-4-moving-existing-data-in-a-partitions/) - Переместим существующие данные из исходных секций таблиц Customer и Order в их соответствующие split-target секции. Откройте командную строку Proenv и перейдите в каталог C:\OpenEdge\WRK\tablepartitioning. Переместите данные таблицы Customer в split-target секции: proutil sportsco -C partitionmanage split table customer composite initial Обратите внимание на то, что после завершения работы этой команды, в исходной композитной секции не - [Задание 4. Перемещение локальных индексов](https://rupug.pro/lessons/task-4-moving-local-indexes/) - В этом задание необходимо переместить локальные индексы голландской и итальянской секций в область хранения CustomerIndex2: Выполните перемещение локального индекса CountrySalesrepLocalIdx голландской секции Customer-9 в область хранения CustomerIndex2: proutil sportsco -C idxmove customer.countrysalesreplocalidx customerindex2 partition customer-9 proenv>proutil sportsco -C idxmove customer.countrysalesreplocalidx customerindex2 partition customer-9 OpenEdge Release 12.0 as of Fri Feb 22 19:02:39 EST 2019 Attempting - [Задание 4 – тестирование публикаций](https://rupug.pro/lessons/pasoe-dba-14/) - В этой части вы проверите, успешно ли развёрнуты коды приложений ABL, REST и SOAP на экземпляре instance1. Выполните рестарт экземпляра instance1: В proenv перейдите в каталог bin инсталляции экземпляра instance1 cd C:\OpenEdge\WRK\instance1\bin Выполните следующую команду для остановки сервера приложений: tcman.bat stop instance1 Выполните следующую команду для старта сервера приложений: tcman.bat start instance1 Тестирование ABL-кода: Откройте - [Задание 3: сопоставление REST-методов с ABL-операциями](https://rupug.pro/lessons/rest-22/) - В этом задании необходимо с помощью REST Resource URI Editor связать REST-методы c ABL-операциями. Сопоставьте метод POST ресурса /Customers с процедурой CreateCustomer.p: Выделите ресурс /Customers в списке ресурсов. Выделите операцию POST в списке методов (в блоке Verb Association). В открывшемся окне выберите процедуру CreateCustomer.p и нажмите кнопку OK. Сопоставьте метод GET ресурса /Customers с операцией ReadAll - [Задание 3: Создание URI](https://rupug.pro/lessons/rest-41/) - Теперь сформируем URI для доступа к REST-сервису. Добавьте оператор using для включения библиотеки OpenEdge.Net.URI в файл процедуры ClientREST.p в блок Definitions: using OpenEdge.Net.URI. Опишите переменную oURI с типом URI в блоке Preprocessor Definitions: define variable oURI as URI no-undo. Постройте URI указав в качестве схемы http, IP-адрес или имя хоста сервера приложений PAS for OpenEdge, - [Задание 3: настройка oepas1 для обслуживания приложения](https://rupug.pro/lessons/rest-9/) - Для запуска ABL-приложения нам необходим сервер приложений. В качестве сервера приложений мы будем использовать oepas1, который является стандартным экземпляром PAS for OpenEdge, установленным вместе с Developer Studio. В этой части вы настроите oepas1 для размещения приложения-примера, указав детали для подключения к базе данных и настроив PROPATH с помощью OpenEdge Explorer. Откройте страницу ABL Application Configurations - [Задание 3: Извлечение данных](https://rupug.pro/lessons/rest-48/) - Теперь вы добавите код для получения свойств конфигурации, используя RESST-метод GET, и заполнить форму. Щёлкните правой кнопкой мыши в любом месте формы и выберите пункт меню View Source или нажмите клавишу F9. Добавим операторы using, для включения в код необходимых классов. Для этого в верхней части кода, сразу за существующими операторами USING добавьте следующие: using - [Задание 3. Создание политики секционирования с помощью ABL API](https://rupug.pro/lessons/task-3-create-a-partition-policy-using-the-abl-api/) - В этом задании необходимо с помощью ABL API for Table Partitioning Management создать политику секционирования на основе списка для таблицы tpPurchaseOrder. После чего создать десять деталей политики. Обратите внимание, на первом занятии мы уже выделили пространство для областей хранения секций таблицы tpPurchaseOrder, сейчас мы должны их задействовать. В качестве шаблона для новой политики мы будем - [Задание 3. Сжатие локальных индексов](https://rupug.pro/lessons/task-3-compression-of-the-local-index/) - В этом задании необходимо выполнить сжатие локальных индексов австрийской и финской секций. Выполните сжатие до 80% локального индекса CountrySalesrepLocalIdx для австрийской секции (Customer-2): proutil sportsco -C idxcompact customer.countrysalesreplocalidx partition customer-2 80 proenv>proutil sportsco -C idxcompact customer.countrysalesreplocalidx partition customer-2 80 OpenEdge Release 12.0 as of Fri Feb 22 19:02:39 EST 2019 Index compaction successfully completed (16180) - [Задание 3. Подготовка секций к миграции данных](https://rupug.pro/lessons/task-3-preparing-partitions-for-data-migration/) - Используя Database Administration Console подготовим таблицы Customer и Order к миграции данных. Подготовка всех секций таблицы Customer к миграции: На странице Table Partition Policies щёлкните по ссылке Edit Details в столбце Action для политики секционирования Customer. Откроется страница редактирования деталей политики секционирования. Щёлкните двойным щелчком по первой детали политики и установите флаг Split-target. Щёлкните по - [Задание 3. Объединение секций](https://rupug.pro/lessons/task-3-merging-sections/) - Объедините секции с данными до 2000 (Order_2000) с секцией с данными до 2005 (Order_2005) годов, далее объедините секции с данными до 2010 (Order_2010) с секцией с данными до 2015 (Order_2015) годов. Объединение секции с данными до 2000 года с секцией с данными до 2005 года: proutil sportsco -C partitionmanage merge table order partition Order_2000 partition - [Задание 3. Активация OpenEdge Table Partitioning в работающей базе данных](https://rupug.pro/lessons/task-3-activation-openedge-table-partitioning-in-a-running-database/) - С помощью Database Administration Console активируйте OpenEdge Table Partitioning в работающей базе данных sportsco: В OpenEdge Management щёлкните Database Administration -> Go to Database Administration. Щёлкните по базе sportsco. Активируйте табличное секционирование в базе sportsco: Щёлкните Enable в строке Table Partitioning в секции Database Features. Щёлкните по кнопке Enable table partitioning в следующем окне: OpenEdge - [Задание 3 – публикация кода приложения на экземпляре](https://rupug.pro/lessons/pasoe-dba-13/) - Теперь вы развернёте на экземпляре instance1 код приложения ABL, REST и SOAP, поставляемый вместе с файлами тренинга (в каталоге C:\OpenEdge\WRK\pasoe). Для публикации ABL-кода на экземпляре instance1 мы используем процедуру EnvVar.p. Скопируйте эту процедуру из каталога C:\OpenEdge\WRK\pasoe в каталог экземпляра C:\OpenEdge\WRK\instance1\webapps\ROOT\WEB-INF\openedge. Для публикации кода REST-приложения (RESTService.paar и GetCustomer.p): Перейдите в каталог bin экземпляра instance1 cd C:\OpenEdge\WRK\instance1\bin - [Задание 2: создание подключения к базе данных](https://rupug.pro/lessons/rest-8/) - В этой части вы скопируете базу данных sports2000 в указанное место рабочей области и настроите подключение к ней приложения-примера. Для копирования базы данных sports2000 выполните следующие действия: Откройте командную строку Start>All Programs > Progress > OpenEdge > Proenv В рабочем каталоге OpenEdge (WRK) создайте каталог restdb и перейдите в него: mkdir restdb cd restdb Выполните - [Задание 2: Создание клиента](https://rupug.pro/lessons/rest-40/) - В этом задании вы создадите клиента с включёнными файлами cookie. Добавьте в файл ClientREST.p оператор using для включения библиотеки OpenEdge.Net.HTTP.*. Для этого введите следующий код блоке Definitions: using OpenEdge.Net.HTTP.*. Добавьте переменную oClient с типом IHttpClient в блок Preprocessor Definitions: define variable oClient as IHttpClient no-undo. Добавьте экземпляр IHttpClient используя класс ClientBuilder с включёнными cookies в - [Задание 2: Подготовка формы](https://rupug.pro/lessons/rest-47/) - Следующим шагом вы подготовите графическую форму, которая будет содержать несколько полей для отображения и редактирования параметров сервера приложений и кнопки для запроса и обновления параметров на сервере приложений. ProjectExplorer перейдите в каталог src проекта OERESTGUI и дважды щёлкните по файлу класса Formcls. Шаблон формы по умолчанию откроется в визуальном дизайнере. В свойствах формы измените название - [Задание 2: добавление REST-ресурсов в REST-сервис](https://rupug.pro/lessons/rest-21/) - В этом задании вы будете использовать REST Resource URI Editor для добавления ресурсов в REST-сервис, который был создан в первом задании. Добавлено будет четыре REST-ресурса, где каждый URI ресурса является частью URI REST-сервиса. С помощью REST Resource URI Editor добавьте следующие ресурсы: /Customers /Customers/{custId} /Customers/{custId}/Orders /Customers/{custId}/Orders/{orderNum} Примечание: {custID} в /Customers/{custId} – это параметр пути, который - [Задание 2.2: создание базы данных ATM](https://rupug.pro/lessons/tune-tryit-4/) - В этой части занятия вы сначала создадите пустую базу данных ATM используя структурный файл atm.st, созданный в первой части. Затем заполните её мета-схемой OpenEdge из базы данных empty4 и включите поддержку больших файлов. Откройте Proenv и перейдите в каталог C:\OpenEdge\WRK\dbtune\atm\db: cd C:\OpenEdge\WRK\dbtune\atm\db Проверьте структурный файл atm.st на корректность синтаксиса и параметров областей хранения: prostrct create - [Задание 2. Создание политики секционирования в Database Administration Console](https://rupug.pro/lessons/task-2-create-a-partition-policy-in-the-database-administration-console/) - С помощью Database Administration Console необходимо создать политику секционирования по диапазону в таблице tpInvoice. Затем создать три детали политики секционирования. Подключитесь к консоли администрирования: Start -> All Programs -> Progress -> OpenEdge -> Database Administration Console. В верхнем меню откройте Database Administration -> Go to Database Administration. В списке доступных для администрирования баз данных щёлкните мышью - [Задание 2. Создание политик секционирования и связанных с ними деталей](https://rupug.pro/lessons/task-2-creating-policies-for-partitioning-and-related-parts/) - В Database Administration Console нам нужно теперь создать политику секционирования, реализующую подсекционирование list-list для таблицы Customer. Затем создадим политику секционирования, реализующую подсекционирование list-range для таблицы Order. Таблица Свойства политики секционирования Customer Policy name: Customer Table: Customer Default data area: CustomerData1 Default index area: CustomerIndex1 Default LOB area: CustomerData1 Object allocation rule: Immediate Fields: Country, Salesrep - [Задание 2. Разделение и переименование секций](https://rupug.pro/lessons/task-2-split-and-renaming-of-sections/) - Необходимо разделить секцию Order с данными до 2000 года, добавив две новые секции для данных до 1995 и 1999 годов, и переименовать секцию с данными 2000 года. После этого разделить секцию с данными до 2010 года, добавив две новые секции с данными до 2005 и 2009 годов, и переименовать секцию с данными за 2010 год. - [Задание 2. Настройка базы данных в качестве управляемого ресурса OE Management](https://rupug.pro/lessons/task-2-configuring-the-database-as-a-managed-resource-in-oe-management/) - Включим базу данных sportsco в OpenEdge Management в качестве управляемого ресурса. Для этого выполним следующее: Подключитесь к OpenEdge Management: Start -> All Programs -> Progress -> OpenEdge -> Management Console Введите учетную запись и пароль администратора и щёлкните по кнопке Login. Перейдите в меню Resources и выберите New -> Database Настройте новый ресурс OpenEdge, используя - [Задание 2. Исправление логических индексных повреждений](https://rupug.pro/lessons/task-2-fix-logical-index-corruption/) - Представьте, что в австралийской секции таблицы Customer возникли логические повреждения индексов. В этом задании вам необходимо исправить индексные повреждения в этой секции. Запустите утилиту PROUTIL IDXFIX на базе данных sportsco: proenv>proutil sportsco -C idxfix OpenEdge Release 12.0 as of Fri Feb 22 19:02:39 EST 2019 Index Fix Utility 1. Scan records for missing index entries - [Задание 2 – развёртывание приложения WebHandler WebSpeed](https://rupug.pro/lessons/pasoe-dba-19/) - В этом задании вы развернёте приложение WebHandler WebSpeed на экземпляре PAS for OpenEdge и затем вызовете его. Скопируйте файл класса CustomerHandler.cls из каталога C:\OpenEdge\WRK\pasoe в каталог из PROPATH экземпляра C:\OpenEdge\WRK\instance1\webapps\ROOT\WEB-INF\openedge. Добавьте обработчик handler1 для класса CustomerHandler.cls в файл свойств openedge.properties. Выполните следующую команду из каталога \bin экземпляра: oeprop +instance1.ROOT.WEB.handler1=CustomerHandler:/Customer/{custid} Проверьте правильность добавления: oeprop instance1.ROOT.WEB.handler1 Команда - [Задание 2 – подключение экземпляра к базе данных](https://rupug.pro/lessons/pasoe-dba-12/) - В этой части вы скопируете базу данных sports2000 из установочного каталога OpenEdge в рабочий каталог, а затем настроите instance1 для подключения к ней. В Proenv перейдите в рабочий каталог OpenEdge: cd %WRKDIR% Создайте каталог с именем database для базы данных : mkdir database Перейдите в каталог database. Выполните следующую команду в Proenv: procopy %DLC%\sports2000 sports2000 - [Задание 1: Создание проекта OpenEdge и процедурного файла](https://rupug.pro/lessons/rest-39/) - В этом задании необходимо создать проект OpenEdge, включить в него процедурные библиотеки для работы с REST, и создать процедурный файл. Запустите мастер создания нового проекта OpenEdge: Откройте Developer Studio. Выберите пункт меню File > New > OpenEdge Project. На странице Create an OpenEdge project введите OERESTClient в качестве имени проекта. Выберите тип проекта General > - [Задание 1: Создание нового проекта](https://rupug.pro/lessons/rest-46/) - В первую очередь создайте новый проект для разработки графического интерфейса: В Developer Studio выберите пункт меню File > New > OpenEdge Project. В качестве имени проекта укажите OERESTGUI. Выберите тип проекта Client и GUI for .NET. Щёлкните по кнопке Next. На странице Select AVM and layout options выберите Use separate source and r-code directories. Замените - [Задание 1: аннотирование ABL-ресурсов и создание REST-сервиса](https://rupug.pro/lessons/rest-20/) - В этом задании вам необходимо с помощью мастера создания интерфейса сервиса в Developer Studio выполнить аннотирование ABL-ресурсов в приложении-примере. Используя Define Service Interface wizard, выполните аннотацию следующих операций Create, Delete1, Read1, ReadAll и Update1 в классе Customer.cls. Откройте Developer Studio, Start>All Programs>Progress>OpenEdge > Developer Studio. Разверните проект CustomerOrderApp. Перейдите в папку src>AppServer > crm. Здесь - [Задание 1. Создание секционно-ориентированных индексов](https://rupug.pro/lessons/task-1-creation-of-section-oriented-indexes/) - С помощью Data Dictionary создадим два секционно-ориентированных индекса для двух таблиц Customer и Order в базе данных sportsco. Таблица Поля Индекс Область хранения Customer Country Salesrep CountrySalesrepLocalIdx CustomerIndex1 Order Carrier OrderDate CarrierOrderDateLocalIdx OrderIndex1 Откройте инструментарий Data Dictionary: Start -> All Programs -> Progress -> OpenEdge -> Data Dictionary. Подключитесь к базе данных sportsco - [Задание 1. Создание новых секционных таблиц в Data Dictionary](https://rupug.pro/lessons/task-1-create-new-partition-tables-in-data-dictionary/) - В тестовой базе данных sportsco необходимо создать две новые секционированные таблицы tpInvoice и tpPurchaseOrder, используя для этого Data Dictionary. Запустите Data Dictionary, щёлкнув Start -> All Programs -> Progress -> OpenEdge -> Data Dictionary Подключитесь к базе данных sportsco в многопользовательском режиме: Выберите Connect to an Existing Database и затем щёлкните OK, чтобы открыть диалоговое - [Задание 1. Создание базы данных и выделение пространства для секций](https://rupug.pro/lessons/task-1-create-a-database-and-allocate-space-for-partitions/) - Необходимо создать тестовую базу данных sportsco на основе базы данных Sports3000, и затем выделить пространство для секций таблиц tpInvoice, tpPurchaseOrder, Customer и Order. Запустите Proenv: Start -> All Programs -> Progress -> OpenEdge -> Proenv Перейдите в каталог C:\OpenEdge\WRK\tablepartitioning cd tablepartitioning Создайте базу данных с именем sportsco на основе базы данных Sports3000 prodb sportsco sports3000 - [Задание 1. Сбор и анализ статистики с помощью PROUTIL](https://rupug.pro/lessons/task-1-collecting-and-analyzing-statistics-using-proutil/) - В тестовой базе данных sporstco с помощью утилит PROUTIL TABANALYS и IDXANALYS необходимо собрать и проанализировать статистику для секционированной таблицы Customer. Кроме того, необходимо сгенерировать файлы, в которых данные по секционированной таблице Order должны быть разделены по колонкам. Откройте командную строку Proenv: Start -> All Programs -> Progress -> OpenEdge -> Proenv Перейдите в каталог - [Задание 1. Перестройка локальных индексов](https://rupug.pro/lessons/task-1-rebuilding-local-indexes/) - В этом задании необходимо выполнить перестроение всех локальных индексов французских секций в таблице Customer, для этого: Откройте командную строку PROENV и перейдите в каталог C:\OpenEdge\WRK\tablepartitioning: Запуск Proenv: Start -> All Programs -> Progress -> OpenEdge -> Proenv Переход в каталог: cd tablepartitioning Активируйте возможность построения индексов в секциях для базы данных sportsco: proutil sportsco -C - [Задание 1. Добавление секций](https://rupug.pro/lessons/task-1-adding-partitions/) - В тестовой базе данных sportco в таблицу Order необходимо добавить две новые секции для данных до 2015 и 2019 годов. В OpenEdge Management/Explorer откройтё страницу Database Administration для базы данных sportsco. В секции Storage Management щёлкните по ссылке Partition policies. Откроется страница Table Partition Policies. Перейдите к деталям политики секционирования Order и добавьте две новые - [Задание 1 – создание экземпляра PAS for OpenEdge](https://rupug.pro/lessons/pasoe-dba-11/) - В этой части вы создадите экземпляр PAS for OpenEdge с именем instance1 в рабочем каталоге OpenEdge (WRK). Откройте Proenv. (Для Windows: Start > All Programms > Progress > OpenEdge > Proenv. Для UNIX: $DLC/bin/proenv) Перейдите в каталог bin корневой инсталляции PAS for OpenEdge: cd %DLC%\servers\pasoe\bin Выполните следующую команду: tcman.bat create -p 9910 -P 9911 -s - [Задание 1 – развёртывание классического приложения WebSpeed](https://rupug.pro/lessons/pasoe-dba-18/) - В этом задании вы сначала развернёте классическое приложение WebSpeed на экземпляре PAS for OpenEdge, а затем вызовете это приложение. Обратите внимание, что классическое приложение WebSpeed, которое вы используете для этого упражнения, не использует статические файлы (изображения и HTML). Однако, в реальных условиях, большинство WebSpeed приложений используют статические файлы. Копирование файла w-sstcst.w из C:\OpenEdge\WRK\pasoe в C:\OpenEdge\WRK\instance1\webapps\ROOT\WEB-INF\openedge - [Загрузка описания данных](https://rupug.pro/lessons/load-data-definitions/) - После создания целевой базы данных можно приступить к загрузке в неё файлов с данными. Загрузка файлов должна выполняться в том же порядке, как они были выгружены. Сначала загружается файл с описанием данных (.df), затем файлы с содержимым таблиц и затем файлы со значениями секвенций. Для загрузки описания данных в новую базу используется инструмент Data Administration. - [Загрузка новых данных в секции](https://rupug.pro/lessons/loading-new-data-in-the-partition/) - На предыдущем уроке вы узнали, как создавать новые секционированные таблицы. На этом уроке было описано, как реализовать секционирование в существующих таблицах. Ещё может возникнуть ситуация, когда вам будет необходимо загрузить новые данные в секции. Существует два основных способа загрузки данных в секции таблицы в онлайн: С помощью Database Administration Console. С помощью бинарной загрузки. Если - [Другие источники информации](https://rupug.pro/lessons/other-sources-of-information/) - В процессе работы с продуктами OpenEdge рано или поздно возникает необходимость в получении дополнительной информации по платформе. Основные источники получения такой информации представлены в следующей таблице: Таблица 1. Источники информации Наименование Описание Язык Сайт Progress Community Официальный портал компании Progress Software. Здесь можно задать вопрос и получить ответ от сообщества пользователей Progress-продуктов. Требуется регистрация для - [Доступ к REST-сервисам из ABL](https://rupug.pro/lessons/rest-28/) - OpenEdge предоставляет библиотеку классов OpenEdge.Net.HTTP.*, которая позволяет получить доступ к сервисам REST из приложения ABL. Эта библиотека предоставляет такие интерфейсы, как IHttpClient, IHTTPRequest и IHTTPResponse, а также такие классы, как Cookie и URI для доступа к REST-сервисам. Библиотека OpenEdge.Net.HTTP.*: Не имеет ограничений по типам контента. ABL рассматривает ответ как объект, который может иметь любой тип - [Дополнительные параметры улучшения производительности](https://rupug.pro/lessons/more-options-improvements-performance/) - Для улучшения производительности утилиты PROUTIL IDXBUILD применяются четыре дополнительных параметра. Размер блока для операции слияния -TMB . Это размер блоков, используемых для слияния блоков сортировки. По умолчанию значение -TMB равно значению -TB, которое является минимально допустим значением для -TMB. Увеличение размер блока слияния может улучшить производительность. Эффективное значение параметра подбирается опытным путём с помощью тестов. - [Дополнительные компоненты](https://rupug.pro/lessons/additional-component/) - СУБД OpenEdge предоставляет ряд функций, расширяющих возможности базы данных для поддержки критически важных корпоративных требований. Такими функциями являются: Multi-tenancy Table partitioning Change Data Capture Replication Transparent Data Encryption Для каждой из этих функций необходима отдельная лицензия если вы используете редакции Workgroup или Enterprise. В редакцию Advanced Enterprise эти функции включены по умолчанию. OpenEdge Multi-Tenancy OpenEdge - [Добавление экстентов в офлайн](https://rupug.pro/lessons/adding-extents-offline/) - Если у вас есть возможность остановить базу данных, то добавить новые экстенты можно в офлайн. Для этого применяется команда prostrct add. Как вы уже знаете, рекомендуется, чтобы последний экстент в области хранения всегда был переменного размера, это обеспечить защиту базы данных от неожиданного переполнения области хранения. При добавлении экстента в офлайн рекомендуется удалить последний экстент - [Добавление экстентов в онлайн](https://rupug.pro/lessons/adding-extents-online/) - Когда база данных находится в онлайн и с ней работают пользователи, вы можете добавлять экстенты в следующие области хранения: Before-Image. After-Image. Существующие прикладные области хранения. Создавать новые прикладные области хранения. Для добавления экстентов в онлайн применяется утилита prostrct addonline. При добавлении экстентов в онлайн существуют некоторые ограничения: Если в базе данных включён After-Imaging, то вы - [Добавление экстентов (общая информация)](https://rupug.pro/lessons/adding-extents-general/) - После получения информации об использовании пространства областями хранения, вам, возможно, придётся добавить новые экстенты для обеспечения непрерывного роста базы данных. Вы можете добавлять новые экстенты в области хранения Before-Image, After-Image и в прикладные области хранения. Поскольку область хранения представляет собой набор экстентов, то добавление новой области хранения в базу данных это и есть добавление экстентов. - [Добавление файлов в проект](https://rupug.pro/lessons/pdsoe-05/) - После создания проекта в него можно добавить файлы. Существует два варианта добавления файлов в проект. Путём создания нового файла и путём импортирования существующего файла. Новые файлы создаются во время разработки ABL-приложения. Developer Studio имеет мастера для создания различных исходных файлов для ABL приложения, например: ABL Procedure (.p file) ABL Class (.cls file) ABL Include (.i - [Добавление секций в секционированную таблицу](https://rupug.pro/lessons/adding-partitions-to-a-partitioned-table/) - Наиболее распространённым случаем является ситуация, когда вам нужно добавить новые секции к существующей секционированной таблице. Такая необходимость может возникнуть, например, при размещении новых логических группы данных. Логические группы могут быть организованы по историческому, временному, географическому, организационному или числовому признаку. Пример - есть таблица Order, которая секционирована по столбцу OrderDate, и ваша компания готовится к началу - [Деактивация локальных индексов](https://rupug.pro/lessons/idxdeactivate/) - Поддержка и обслуживание локальных индексов со временем может требовать все больше и больше системных ресурсов, и ресурсов базы данных. Кроме того, наличие редко используемых индексов в таблице может значительно снижать общую производительность, вызывая излишнюю нагрузку. Вы должны деактивировать локальный индекс в таких ситуациях, как: Приложение больше не использует локальный индекс. В этом случае такой индекс - [Деактивация After-Imaging и AI File Management](https://rupug.pro/lessons/deactivate-after-imaging-and-ai-file-management/) - Для деактивации механизмов After-imaging и AI File Management используется утилита RFUTIL. Последовательность действий по деактивации выглядит следующим образом: Текущий используемый AI-экстент (статус BUSY) помечается как FULL. Копируются все заполненные экстенты (статус FULL). Это необходимо для того, чтобы не потерять данные в AI-экстентах, т.к. RFUTIL после деактивации помечает все экстенты как пустые, данные в них будут - [Генерация описания базы данных](https://rupug.pro/lessons/database-describe/) - На протяжении жизни базы данных вы можете активировать в ней новые функции и/или деактивировать старые. Как администратору базы данных, для выполнения своих задач вам необходимо помнить/знать, какие функции включены в базе. База данных OpenEdge может иметь следующие функции: OpenEdge replication; Large files; Auditing; Transparent Data Encryption; Java Transaction API; After-Image Management/Archiver; Multi-tenancy; Table Partitioning; Change - [Высокоуровневая архитектура OpenEdge-приложений](https://rupug.pro/lessons/high-level-architecture-of-openedge-applications/) - Архитектура приложения определяет структуру приложения и то, как различные части приложения взаимодействуют друг с другом. Необходимо реализовать архитектуру приложения так, чтобы её было легко понять, особенно разработчикам, которые будут развивать, и поддерживать проект. При проектировании приложения лучшим решением будет разделить его на взаимосвязанные части. Как минимум, такими частями могут стать программный код, выполняемый на стороне - [Выполнение кода ABL](https://rupug.pro/lessons/pdsoe-11/) - В Developer Studio код ABL исполняется внутри AVM проекта, в котором он расположен, используя конфигурацию запуска по умолчанию. Конфигурацию запуска можно изменить для любого процедурного файла ABL, например, с целью подключения к базе данных в момент старта AVM или для того, чтобы включить расширенное логирование для работающей программы. Далее приведены шаги для исполнения ABL-процедуры в - [Выполнение запроса](https://rupug.pro/lessons/rest-35/) - После создания клиента и запроса вы должны выполнить запрос, который вернёт ответ типа OpenEdge.Net.HTTP.IHttpResponse. Интерфейс IHttpClient содержит два метода перегруженного метода Execute (), которые позволяют выполнять запрос. Первый метод принимает экземпляр IHttpRequest в качестве входного параметра и возвращает экземпляр IHttpResponse. Синтаксис для выполнения запроса: define variable as OpenEdge.Net.HTTP.IHttpResponse no-undo. = :Execute()). Здесь, - [Выполнение Roll-forward Recovery](https://rupug.pro/lessons/performing-roll-forward-recovery/) - Для восстановления базы данных с помощью Roll-forward Recovery в случае какой-либо катастрофы необходимо на резервном сервере иметь следующие компоненты: Последнюю полную резервную копию базы данных. Все инкрементальные резервные копии, если они создавались. Последний журнал архивации. Все архивы AI-файлов, которые были созданы после формирования последней резервной копии. Если возможно, то AI-экстенты, которые не были заархивированы (FULL - [Выделение пространства для секционированных таблиц](https://rupug.pro/lessons/the-space-allocation-for-partitioned-tables/) - Необходимо быть уверенным, что каждая секция будет иметь достаточно места для текущего использования и роста в будущем, это очень важно! В OpenEdge Table Partitioning вы должны использовать области хранения второго типа для секционируемых таблиц и связанных с ними индексов и LOB-полей. При создании новых областей хранения для секций, вы должны контролировать то, как описывается область - [Выделение памяти для сортировки и слияния индексов](https://rupug.pro/lessons/memory-allocation-for-sort-and-merge/) - Сортировка и слияние индексов являются наиболее ресурсоёмкой фазой процесса переиндексации. Правильная настройка параметров PROUTIL IDXBUILD, которые отвечают за выделение памяти и сортировки, позволяет утилите работать значительно быстрее. Когда утилита PROUTIL IDXBUILD выполняет построение индексных ключей, она помещает их в блоки сортировки в памяти. Размер блока сортировки в памяти определяется в килобайтах параметром -TB. По умолчанию - [Выгрузка описания секвенций](https://rupug.pro/lessons/dump-sequences-definitions/) - Как сообщалось ранее, при выгрузке описания данных всей базы данных СУБД OpenEdge создаёт файл описания данных (.df), содержащий описание всех таблиц, индексов и секвенций в базе данных. Описание секвенций является важной частью базы данных, так как они необходимы для генерации инкрементальных значений, используемых в приложении. Когда необходимо выгрузить только некоторые таблицы, то описание секвенций не - [Выгрузка описания данных](https://rupug.pro/lessons/dump-data-definition/) - Первым шагом в процессе выгрузки является выгрузка описания данных из исходной базы. СУБД OpenEdge позволяет выгрузить как описание всех таблиц сразу, так и описание отдельных таблиц. В первом случае СУБД создаст файл с именем базы данных и расширением .df (dbname.df), который будет содержать описание всех таблиц, индексов и секвенций в базе данных. Во втором случае - [Выгрузка значений секвенций](https://rupug.pro/lessons/dump-sequences-data/) - Исходная база данных может содержать триггеры на событие создания записи в таблице. Такие триггеры часто используются для присвоения определённым полям уникальных последовательных значений, которые генерируется с помощью секвенций. Следовательно, чтобы не нарушить эти последовательности, в целевую базу данных до начала её работы должны быть перенесены текущие значения всех секвенций. Для этого необходимо выгрузить секвенции из - [Выгрузка данных из секций](https://rupug.pro/lessons/dump-data-from-partitions/) - Обычно, выгрузить (dump) данные из секции может быть необходимо в следующих случаях: Необходимо выполнить архивацию данных. Необходимо освободить дисковое пространство, путём усечения секции. В этом случае рекомендуется сохранить данные, выгрузив их. Если вы используете лицензию OpenEdge Enterprise RDBMS и база данных стартована в многопроцессорной среде, то наиболее эффективным решением для быстрой выгрузки данных из секции - [Выгрузка данных в текстовом виде](https://rupug.pro/lessons/data-dump/) - После выгрузки файла описания данных необходимо выгрузить данные из таблиц исходной базы и выполнить их загрузку в целевую базу. Содержимое базы данных для выгрузки можно разделить на две группы: Содержимое таблиц. СУБД OpenEdge позволяет выгрузить содержимое таблиц в виде текстовых файлов (.d) или в виде бинарных файлов (.bd). Для текстовой выгрузки применяется инструмент Data Administration, - [Выгрузка данных в бинарном виде](https://rupug.pro/lessons/binary-dump/) - Выгрузка данных в текстовом виде обычно требуется в очень редких случаях. Как правило, это необходимо при миграции базы между несовместимыми платформами, например, с Windows на Linux, или в случае серьёзных физических повреждений базы данных для того, чтобы сохранить остатки информации. В обычных рабочих условиях, например, когда меняется физическая структура базы данных, количество и параметры областей - [Выбор режима чтения](https://rupug.pro/lessons/prodataset-the-choice-of-reading-mode/) - В методе READ-XML, когда у вас уже есть существующие данные в ProDataSet, очень важен параметр read-mode. Параметр read-mode используется для указания способа загрузки новых данных в ProDataSet. Различные режимы чтения отличаются тем, как AVM обрабатывает возможные повторяющиеся записи. Если ProDataSet пуст, то AVM заполняет временную таблицу без проверки наличия повторяющихся записей по умолчанию. В этом - [Восстановление базы данных](https://rupug.pro/lessons/database-restore/) - В случае серьёзного повреждения базы данных восстановить её можно только из резервной копии. Утилита командной строки prorest используется как для восстановления полной, так и для восстановления инкрементальных копий. В качестве альтернативы этой утилите можно создать задачу в OpenEdge Management и выполнить её, когда будет необходимо. Обычно в промышленной среде редко требуется восстановление базы данных. Чаще - [Включение поддержки больших файлов](https://rupug.pro/lessons/largefile-support/) - Если необходимо создавать экстенты базы данных с размером больше 2ГБ, необходимо активировать поддержку больших файлов в базе данных. После активации поддержки больших файлов в базе данных: Следующие файлы смогут превышать размер 2Гб: Data (.dn); Binary dump (.bd); BI (.bn); AI (.an); Transaction log (.tn). Это не повлияет на существующие экстенты, созданные с предопределённым размером. Не - [Взаимодействие компонент архитектуры](https://rupug.pro/lessons/the-interaction-of-the-components-of-the-architecture/) - Теперь вы знаете, какие существуют компоненты архитектуры СУБД OpenEdge. Но для эффективного администрирования баз данных также важно понимать, как эти компоненты работают вместе. В этой части урока мы сначала расмотрим, как эти компоненты работают совместно во время старта базы данных, а затем – как они взаимодействуют на работающей базе данных, когда пользователи запрашивают доступ и - [Введение в тестовую базу данных](https://rupug.pro/lessons/introduction-to-the-test-database/) - По мере прохождения тренинга, для закрепления материала, вам будет предложено выполнить несколько практических заданий. При этом будет задействована специальная тестовая база данных sportsco, которая содержит множество таблиц, включая таблицы Customer, Order и Item. Вы будете использовать эту базу данных для: добавления и секционирования новых таблиц; секционирования существующих таблиц; управления секциями таблицы; администрирования индексов таблиц. Идентификация - [Введение в структурную обработка ошибок](https://rupug.pro/lessons/introduction-to-structural-error-handling/) - Мы только что завершили рассмотрение традиционной обработки ошибок в ABL и переходим к рассмотрению структурной обработки ошибок. Кратко напомним основные элементы традиционной обработки ошибок и укажем связанные со структурной обработкой отличия (Таблица 9). Далее мы рассмотрим новые возможности языка ABL, связанные со структурной обработкой ошибок: Иерархия классов ошибок ABL и как они относятся с специфическим - [Введение в обработку ошибок](https://rupug.pro/lessons/introduction-to-error-handling/) - Обработка ошибок (error handling, condition handling, exception handling) – это действия, выполняющиеся при возникновении некоторых событий, при которых нормальное выполнение приложения прерывается. В OpenEdge ABL для прерываний используется термин condition, который можно перевести как условие или состояние. В ABL имеется четыре типа прерываний: Состояние ERROR Состояние ENDKEY Состояние STOP Состояние QUIT Состояние ERROR устанавливается, когда - [Введение в OpenEdge Management/Explorer](https://rupug.pro/lessons/openedge-management-explorer/) - OpenEdge Management и OpenEdge Explorer - это веб-инструменты, предназначенные для работы в web-браузере независимо от типа используемой операционной системы. Инструмент OpenEdge Explorer бесплатно доступен во всех версиях СУБД OpenEdge. Он позволяет настраивать и просматривать свойства ресурсов, стартовать и останавливать их, а также просматривать статусы и журналы OpenEdge и системных ресурсов. Инструмент OpenEdge Management – это - [Введение в OpenEdge](https://rupug.pro/lessons/introduction/) - Progress® OpenEdge® — это наиболее полная платформа для разработки и развёртывания встроенных бизнес-приложений. Среда выполнения распределённых приложений OpenEdge состоит из трёх основных компонентов: клиенты; исполняемая на серверах приложений бизнес-логика; одна или более баз данных. Платформа OpenEdge поддерживает широкий спектр клиентов включая мобильных клиентов, веб-приложения, настольных клиентов ABL (Advanced Business Language), клиентов WebSpeed, а также SQL-клиентов - [Введение в Developer Studio](https://rupug.pro/lessons/introduction-to-developer-studio/) - Progress Developer Studio for OpenEdge - это OpenEdge-инструмент, который встроен в среду разработки Eclipse. Здесь вы можете настраивать собственное рабочее пространство, в котором создаются проекты. Проект содержит все или некоторые части вашего приложения. С помощью Developer Studio вы можете создавать, компилировать, выполнять отладку и тестировать ваше приложение, а также: Наглядно моделировать ваше приложение. Разрабатывать программный - [Введение](https://rupug.pro/lessons/the-introduction-of-coding-standards/) - Для того чтобы облегчить читабельность кода и будущее сопровождение, очень важно установить и поддерживать постоянный стиль написания кода. Дополнительным преимуществом является возможность ускорения процесса кодирования и улучшения производительности кода. Вопрос стиля – несомненно, индивидуальный. В то же время, в любой команде разработчиков общий стиль со временем вырабатывается «автоматически» в силу осознания важности единого стиля и - [Введение](https://rupug.pro/lessons/extent-management-introduction/) - Когда база данных стартована и пользователями создаются транзакции, в базу данных добавляются новые данные. Как администратор базы данных, вы должны контролировать скорость заполнения базы, чтобы гарантировать, что у вас всегда будет достаточно дискового пространства для новых данных. На этом уроке вы узнаете, как контролировать использование экстентов базы данных OpenEdge и как добавлять новые экстенты в - [Введение](https://rupug.pro/lessons/tune-28/) - После того, как база данных правильно спроектирована на физическом уровне, настроены базовые параметры старта и выполнен старт базы данных, производительность базы данных должна показывать хорошие результаты. Но с течением времени администратор должен выполнять упреждающий мониторинг различных частей базы данных и, при необходимости, настраивать их с учётом изменившихся показателей, чтобы база данных имела возможность работать с - [Введение](https://rupug.pro/lessons/introduction-dump-and-load/) - Базы данных используются для различных целей, будь то транзакционная активность, отчётность или анализ данных, но объединяет их одна главная черта – данные в них изменяются и накапливаются, что с течением времени делает базу данных дезорганизованной и как следствие неэффективной в использовании. Что приводит к этому? Существует три основные причины: Записи могу становиться фрагментированными и рассеянными, - [Введение](https://rupug.pro/lessons/start-stop-database-introduction/) - Теперь, когда вы научились создавать базу данных, вы должны её стартовать, чтобы сделать доступной пользователям. В тоже время, необходимо знать, как правильно останавливать базу или как стартовать её в разных режимах. На этом уроке вы узнаете, как стартовать и останавливать базы данных OpenEdge в однопользовательском и многопользовательском режимах. База данных может работать в двух режимах - [Введение](https://rupug.pro/lessons/tune-6/) - Настройка производительности базы данных начинается со стадии проектирования. Необходимо стараться заложить всё возможное для обеспечения оптимальной производительности базы данных на стадии проектирования, чем решать эти задачи на уже работающей продукции. Поэтому, если у администратора есть возможность создать новую базу данных с нуля или появится возможность реструктурировать существующую, то он должен попытаться спроектировать её таким образом, - [Введение](https://rupug.pro/lessons/tp-introduction/) - Всё чаще и чаще современные базы данных Progress OpenEdge перешагивают тот барьер в компании, когда они начинают считаться большими базами данных – ведь бизнес многих компаний старается работать круглосуточно. Количество накопленной и обрабатываемой информации всё больше и больше заставляет считаться с размером СУБД и с местом её физического расположения. До выхода Progress OpenEdge 11.4 каждая - [Блокирование записей](https://rupug.pro/lessons/locking-records/) - Операторы манипулирования данными. Диаграмма (Рис. 8) показывает операторы манипулирования данными в ABL и их соответствие четырем уровням взаимодействия: Запись в базе данных или временной таблице (Database Record). Запись в буфере записи (Record Buffer). Запись в буфере экрана, как она видна пользователю (Screen Buffer). Действия пользователя над буфером экрана (User). Из диаграммы видно, что некоторые операторы - [Блок базы данных](https://rupug.pro/lessons/database-block/) - Блок базы данных – это наименьшая единица хранения данных в базе. По своей сути база представляет собой набор блоков. Все блоки базы данных в пределах одного кластера являются смежными и хранят данные одного и того же объекта, будь то таблица или индекс. Размер блока базы данных может иметь одно из четырёх значений: 1К, 2К, 4К - [Бинарная загрузка данных](https://rupug.pro/lessons/binary-load/) - Если выгрузка содержимого таблиц выполнялась в бинарные файлы (.bd), то и загрузка в целевую базу должна выполняться в бинарном виде. Бинарная загрузка наиболее быстрый способ загрузки содержимого таблиц в базу данных потому, что: пропускаются все операторы CREATE TRIGGER; деактивируются все индексы; загружаемые бинарные данные более компактны, чем данные в текстовом виде. Внимание! Необходимо осторожно использовать - [Балансировка нагрузки с помощью сервера Apache Tomcat](https://rupug.pro/lessons/pasoe-dba-28/) - Балансировка нагрузки позволяет управлять входящим трафиком, контролируя распределение клиентских запросов. В классическом OpenEdge AppServer использовалась комбинация избыточных NameServer-ов и AppServer-ов для реализации балансировки нагрузки. В Progress Application Server for OpenEdge (PAS for OpenEdge) балансировка нагрузки реализуется через стандартные параметры HTTP, используя один из сторонних продуктов балансировки нагрузки, таких как Apache HTTP, Apache Tomcat или Amazon - [База данных на диске](https://rupug.pro/lessons/database-on-disk/) - База данных на диске состоит из двух частей – логической и физической. Логическая база данных состоит из следующих объектов: Таблица – набор строк и столбцов; Индекс – объект базы данных, используемый для идентификации строк в таблице; Счётчик (Sequence) – генератор чисел, используемый в триггерах для создания последовательных значений. Как правило, разработчики приложений работают с логической - [Архивирование резервных копий](https://rupug.pro/lessons/backup-archiving/) - Правильное архивирование резервных копий позволит обеспечить целостность базы данных. Следуйте этим рекомендациям: Метка каждой резервной копии должна содержать: Тип резервной копии (full или incremental, online или offline). Дату и время. Версию релиза базы данных. Автора резервной копии. Использованную команду резервного копирования. Том резервной копии (например, Vol. 1 of 5 для инкрементальной копии). Полный путь к - [Аннотация ABL-ресурсов](https://rupug.pro/lessons/rest-15/) - Первым шагом является аннотирование ресурсов ABL в приложении ABL с помощью мастера создания интерфейса сервиса (Define Service Interface). Для этого необходимо выполнить следующие действия в проекте, в котором вы хотите создать REST-сервис: Запустить мастер создания интерфейса сервиса для ABL-ресурса (класса или файла процедуры). Выбрать ABL-операции, которые необходимо аннотировать, чтобы представить их как REST-операции. Просмотреть и - [Анализ кода и ProLint](https://rupug.pro/lessons/code-analysis-and-proliant/) - ProLint представляет собой инструмент для автоматического статического анализа кода на OpenEdge ABL. Он читает исходные файлы кода и исследует их на соответствие стандартам и практикам программирования. Prolint является открытым (Open Source) проектом и доступен по адресу: http://www.oehive.org/prolint. Для анализа кода OpenEdge ABL Ver. 10.2B и выше требуется ProLint версии 74. ProLint выполняет только анализ кода. - [Активация табличного секционирования в базе данных](https://rupug.pro/lessons/activating-table-partitioning-in-a-database/) - После выделения пространства для секций, вы готовы к активации OpenEdge Table Partitioning в базе данных с помощью Database Administration Console. Здесь стоит отметить, что по мере необходимости вы можете создавать новые области хранения для секций и после включения механизма, т.е. активация Table Partitioning не означает, что после этого вы не сможете добавлять новые области. Перед - [Активация локальных индексов](https://rupug.pro/lessons/idxactivate/) - Иногда, могут возникать ситуации, когда вам будет необходимо активировать локальные индексы. В основном это может понадобиться в следующих случаях: Вы создали локальный индекс в очень большой таблице, при этом, чтобы минимизировать влияние от его построения на базу данных, вы создали его неактивным. Теперь необходимо активировать его в онлайн. Локальный индекс был ранее деактивирован, но теперь - [Активация Swagger UI](https://rupug.pro/lessons/pasoe-dba-36/) - Начиная с OpenEdge 11.7.4 для работы с REST API был добавлен фреймворк для спецификации RESTful API – Swagger UI. По умолчанию это фреймворк отключён, чтобы предотвратить несанкционированный доступ к экземпляру неавторизованным пользователем. Перейдите в каталог экземпляра \webapps\oemanager\WEB-INF Откройте для редактирования файл конфигурации oemgrSecurity-container.xml Раскомментируйте следующую строку (примерный номер строки 35): - [Активация After-Imaging и AI File Management](https://rupug.pro/lessons/activate-after-imaging-and-ai-file-management/) - Существует два варианта активации механизма After-Imaging и AI File Management: в онлайн; в офлайн. Для активации в офлайн, когда база данных остановлена, используйте параметр AIMAGE BEGIN утилиты RFUTIL. Перед этим необходимо сформировать полную резервную копию базы данных, так как AI-файлы и полная резервная копия используются совместно для восстановления базы. Для активации в офлайн необходимо: Сформировать - [Автоматизация обмена данными с помощью XML](https://rupug.pro/lessons/prodataset-automating-xml-exchange/) - Одной из ключевых возможностей наборов данных ProDataSet является способность легко преобразовывать данные в основные форматы обмена данными (XML или JSON) и обратно. XML и XML Schema предоставляют основанный на стандартах формат для передачи содержимого ProDataSet в другие приложения и из них. В OpenEdge существуют функции, которые позволяют легко считать и записать данные в этом формате - [Storage Object Cache Size](https://rupug.pro/lessons/tune-35/) - Из предыдущей главы вы узнали, как использовать параметр старта Storage Object Cache Size (–omsize) для указания количества часто используемых объектов базы данных, чьё описание должно быть кэшировано в разделяемой памяти для быстрого доступа к ним. В момент старта базы данных создаются первичный и вторичный кэши хранимых объектов, каждый из которых имеет размер, определённый значением параметра - [Shared Memory Overflow Size](https://rupug.pro/lessons/tune-36/) - Когда СУБД OpenEdge выполняет старт базы данных, происходит инициализации и размещение разделяемой памяти на основании анализа значений параметров старта и установленных размеров и количества некоторых структур данных, которые заполняют разделяемую память. Область разделяемой памяти содержит два сегмента: используемый (Used) и свободный (Free). Кроме того, разделяемая память имеет область переполнения, которая по умолчанию имеет размер 23 - [Progress Developer Studio for OpenEdge](https://rupug.pro/lessons/pdsoe-01/) - Среда Developer Studio встроена в среду разработки Eclipse и предназначена для создания, компиляции, отладки и тестирования вашего приложения. Вы можете использовать Developer Studio для: Визуального моделирования приложения. Разработки программного кода на различных языках программирования. Использования языковых редакторов, в том числе редакторы для ABL. Отладки приложения. Тестирования приложения. Управления серверами OpenEdge. Упаковки приложения OpenEdge для развёртывания - [PROENV](https://rupug.pro/lessons/proenv/) - Proenv – это инструмент командной строки, который устанавливает указатели на исполняемые файлы СУБД OpenEdge и рабочий каталог Proenv. С его помощью можно вызывать утилиты и команды администрирования OpenEdge. В первую очередь вы должны знать, как стартовать Proenv. Следующая таблица объясняет, как стартовать Proenv в операционных системах Windows и UNIX. Операционная система Шаги для старта Windows - [HTTP запрос и ответ](https://rupug.pro/lessons/rest-27/) - Итак, вспомним. HTTP – это протокол прикладного уровня для распределённых информационных систем, который является основной для передачи данных во всемирной сети. REST – это архитектурный стиль для распределённых вычислений, который работает в сочетании с HTTP. REST – это упрощённая альтернатива веб-сервисам, использующим простой протокол доступа к объектам (SOAP) или язык описания веб-служб (WSDL). Сегодня REST - [Developer Studio и веб-приложение REST](https://rupug.pro/lessons/rest-4/) - В OpenEdge разрабатывать REST-сервисы рекомендуется с помощью Progress Developer Studio for OpenEdge (далее Developer Studio). Developer Studio значительно экономит время разработчика и упрощает его работу, с его помощью вы можете: Создавать веб-приложение Связывать ресурсы REST WEB с ресурсами ABL. Развёртывать веб-приложение В процессе инсталляции Developer Studio автоматически создаётся и настраивается экземпляр PAS for OpenEdge с - [DEBUGGER](https://rupug.pro/lessons/debugger/) - OpenEdge® Debugger не предназначен непосредственно для решения задач повышения эффективности приложения. Тем не менее, он может оказаться полезным при анализе и устранении таких проблем, особенно связанных со сложной логикой. OpenEdge® Debugger представляет собой интерактивный инструмент, позволяющий Вам контролировать и мониторить исполнение компилируемых процедур ABL. Вы можете выполнять процедуры и их суб-процедуры, выполнять процедуры пошагово, строка - [Data Administration/Data Dictionary](https://rupug.pro/lessons/data-administration-data-dictionary/) - Инструменты администрирования данных позволяют выполнять различные административные задачи в базе данных, управление схемой базы данных (таблицами, индексами, счётчиками и т.д.), выполнение текстовой выгрузки и загрузки данных и многое другое. Существует два варианта инструментов администрирования данных: Data Administration (для Windows) Data Dictionary (для UNIX) Функциональность этих инструментов идентична, различие только в типе пользовательского интерфейса. В Windows - [After-Imaging и автоматическое управление AI-файлами](https://rupug.pro/lessons/after-imaging-and-ai-file-management/) - После добавления в базу данных AI-экстентов необходимо активировать механизм After-Imaging, в результате чего AI-экстенты станут заполняться AI-заметками о транзакциях. Для того, чтобы в AI-экстентах не закончилось пространство, надо активировать механизм AI File Management, задачей которого является управление AI-экстентами. Управление AI-экстентами состоит из следующих задач: Мониторинг AI-экстентов. Механизм AI File Management выполняет мониторинг AI-экстентов, чтобы обеспечить - [ABL блоки](https://rupug.pro/lessons/abl-blocks/) - Эта тема очень важна, так как в ABL именно к блокам языка привязаны области видимости элементов языка, включая области видимости буферов записи. К блокам также привязана обработка транзакций и ошибок. Ошибки в ABL возникают на уровне операторов и затем обрабатываются ближайшим охватывающим блоком. Способ обработки определяется свойствами блока по умолчанию и опциями, заданными в заголовке - [Создание динамичных ProDataSet](https://rupug.pro/lessons/creating-dynamic-prodatasets/) - Если вы заранее не знаете, какую получите схему, то AVM может создать динамический ProDataSet во время выполнения. Динамические ProDataSet используются для того, чтобы обеспечить соответствие входящей схеме XML. Предположим, что вы обмениваетесь данными с клиентом только один или два раза в год. Вы хотите обмениваться различными видами данных каждый раз, в зависимости от текущих требований ## Тесты - [Самоконтроль](https://rupug.pro/quizzes/check-for-understanding-8/) - [Самоконтроль](https://rupug.pro/quizzes/check-for-understanding-7/) - Далее предлагается небольшой опрос для проверки вашего понимания пройдённого материала. - [Самоконтроль](https://rupug.pro/quizzes/check-for-understanding-6/) - Далее предлагается небольшой опрос для проверки вашего понимания пройдённого материала. - [Самоконтроль](https://rupug.pro/quizzes/check-for-understanding-5/) - Далее предлагается небольшой опрос для проверки вашего понимания пройдённого материала. - [Самоконтроль](https://rupug.pro/quizzes/check-for-understanding-4/) - Далее предлагается небольшой опрос для проверки вашего понимания пройдённого материала. - [Самоконтроль](https://rupug.pro/quizzes/check-for-understanding-3/) - Далее предлагается небольшой опрос для проверки вашего понимания пройдённого материала. - [Самоконтроль](https://rupug.pro/quizzes/check-for-understanding-1/) - Далее предлагается небольшой опрос для проверки вашего понимания пройдённого материала. - [Самоконтроль](https://rupug.pro/quizzes/check-for-understanding/) - Далее предлагается небольшой опрос для проверки вашего понимания пройдённого материала. - [Самоконтроль](https://rupug.pro/quizzes/check-for-understanding-2/) - Далее предлагается небольшой опрос для проверки вашего понимания пройдённого материала. - [ЭКЗАМЕН: ИСПОЛЬЗОВАНИЕ PRODATASET](https://rupug.pro/quizzes/exam-usage-prodataset/) - [ЭКЗАМЕН](https://rupug.pro/quizzes/exam-101-2/) - [Тест по OERA](https://rupug.pro/quizzes/test-oera/) - OpenEdge Reference Architecture - [ТЕСТ](https://rupug.pro/quizzes/pasoe-dba-test/) - Вы можете пройти тест чтобы проверить полученные знания на тренинге "Введение в PAS for OpenEdge (администрирование)". Вы можете повторно пройти тест не более 7 раз. Результаты тесты будут показаны в конце теста и в личном кабинете. Проходной бал составляет 80% и выше. Пожалуйста, не торопитесь, внимательно прочитайте каждый вопрос и выберите наиболее подходящий ответ. - [Table Partitioning: Экзамен](https://rupug.pro/quizzes/table-partitioning-exam/) ## Банк вопросов - [Выберите правильную последовательность восстановление БД](https://rupug.pro/questions/выберите-правильную-последовательно/) - [Средство на основе браузера, для которого требуется отдельная лицензия и которое можно использовать для мониторинга работающей базы данных, настройки оповещений и планов мониторинга ресурсов OpenEdge.](https://rupug.pro/questions/средство-на-основе-браузера-для-котор/) - [Командная строка Progress, используемая для вызова утилит и команд администрирования базы данных OpenEdge](https://rupug.pro/questions/средство-на-основе-браузера-инсталли/) - [Пользовательский интерфейс, используемый в Unix для дампа и загрузки данных, настройки безопасности данных и пользователей, а также настройки политик шифрования, называется...](https://rupug.pro/questions/средство-на-основе-браузера-для-котор-2/) - [При проверке анализа базы данных (dbanalys), что из следующего будет говорить о необходимости выполнить Dump&Load таблицы?](https://rupug.pro/questions/при-проверке-анализа-базы-данных-что-и/) - [При дампе описания данных всей базы необходимо отдельно выгрузить описание секвенций?](https://rupug.pro/questions/при-дампе-описания-данных-всей-базы-ва/) - [Предположим, вы хотите создать новую базу данных на основе существующей базы данных, предоставленной поставщиком приложения.](https://rupug.pro/questions/какой-из-следующих-методов-следует-ис/) - Какой из следующих методов следует использовать? - [Область содержащая заметки Before-Image называется...](https://rupug.pro/questions/область-содержит-данные-журнала-тран/) - [Какой параметр используется утилитой PROUTIL LOAD для многопоточной загрузки?](https://rupug.pro/questions/какой-параметр-используется-утилито/) - [Какой из следующих параметров команды PROSHUT используется для безусловной фоновой остановки работы базы данных?](https://rupug.pro/questions/какой-из-следующих-параметров-команд/) - [Какие из следующих файлов обязательны для резервного копирования средствами ОС?](https://rupug.pro/questions/какие-из-следующих-файлов-необходимы/) - [Какая из следующих команд является правильной для запуска однопользовательской интерактивной сессии?](https://rupug.pro/questions/какая-из-следующих-команд-является-пр/) - [Какая из следующих команд является правильной для запуска многопользовательской пакетной сессии, подключенной к работающей базе данных?](https://rupug.pro/questions/какой-из-следующих-синтаксисов-являе/) - [Вы можете выполнить частичную проверку резервной копии базы данных онлайн или оффлайн.](https://rupug.pro/questions/вы-можете-выполнить-частичную-провер/) - [Процесс базы данных, который управляет взаимодействием между сетевым клиентом и базой данных.](https://rupug.pro/questions/процесс-базы-данных-который-управляе/) - [Когда вы определяете внутреннюю процедуру сервисного интерфейса для общедоступного метода бизнес-сущности, как эта процедура вызывает метод бизнес-сущности?](https://rupug.pro/questions/когда-вы-определяете-внутреннюю-проц/) - [Какие из приведённых ниже компонентов являются частью определения набора данных?](https://rupug.pro/questions/какие-из-приведённых-ниже-компоненто/) - [Какой тип файла рекомендуется создавать для хранения определений временных таблиц и наборов данных?](https://rupug.pro/questions/какой-тип-файла-рекомендуется-создав/) - [Что необходимо определить для класса бизнес-сущности чтобы класс работал как синглтон?](https://rupug.pro/questions/что-необходимо-определить-для-класса/) - [Какие элементы можно определить в классе интерфейса?](https://rupug.pro/questions/какие-элементы-можно-определить-в-кла/) - [Предположим, вы определили переменную типа класса Department следующим образом:](https://rupug.pro/questions/предположим-вы-определили-переменну/) - define variable Dept as Department no-undo. Как создать экземпляр класса Department, на который будет ссылаться переменная Dept? - [Какой оператор ABL необходимо добавить в начало файла процедуры или класса, если код будет обращаться к экземпляру другого класса?](https://rupug.pro/questions/какой-оператор-abl-необходимо-добавить-в/) - [Какие элементы могут быть частью определения класса?](https://rupug.pro/questions/какие-элементы-могут-быть-частью-опре/) - [Что означает пакет в контексте разработки классов?](https://rupug.pro/questions/что-означает-пакет-в-контексте-разраб/) - [Почему использование оператора assign предпочтительнее для присваивания значений множеству переменных?](https://rupug.pro/questions/почему-использование-оператора-assign-пре/) - [Для чего используется оператор message в ABL-коде?](https://rupug.pro/questions/для-чего-используется-оператор-message-в-abl-ко/) - [Что не так с этим кодом?](https://rupug.pro/questions/что-не-так-с-этим-кодом/) - block-level on error undo, throw. /* здесь мы определяем переменные define variable integer as integer no-undo define variable Num as integer no-undo define variable PO as character no-undo initial "PO-ABC" Num = PO Допустимо несколько вариантов ответов. - [Посмотрите на код вызова внутренней процедуры:](https://rupug.pro/questions/посмотрите-на-код-вызова-внутренней-п/) - run GetCustomerBalance single-run in hProc (input CustNum, output CustBal). - [Где лучше использовать внутренние процедуры?](https://rupug.pro/questions/для-чего-лучше-использовать-внутренн/) - [Для чего AVM использует PROPATH?](https://rupug.pro/questions/для-чего-avm-использует-propath/) - [Рассмотрим следующий вариант использования приложения. Покупатель выполняет поиск продукта для покупки в онлайн. Когда он находит его, он помещает его в свою корзину. Затем оформляет покупку, предоставляя данные кредитной карты и завершает покупку. Платёж подтверждается в биллинговой системе и заказ отправляется в систему доставки. Покупатель получает подтверждённый номер заказа. Какие части этого варианта использования являются действующими лицами приложения?](https://rupug.pro/questions/какие-части-этого-варианта-использов/) - [Какой инструмент мониторинга можно использовать только локально?](https://rupug.pro/questions/какой-инструмент-мониторинга-можно-и/) - [Что необходимо сделать на экземпляре для подготовки к балансировке нагрузки?](https://rupug.pro/questions/что-необходимо-сделать-на-экземпляре/) - [Какие параметры необходимы для подключения клиентом JConsole к экземпляру?](https://rupug.pro/questions/какие-параметры-необходимы-для-подкл/) - [Команда TCMAN DELETE используется для удаления экземпляра PAS for OpenEdge. Из какого каталога вы должны запустить команду TCMAN DELETE?](https://rupug.pro/questions/команда-tcman-delete-используется-для-удаления-2/) - [По сравнению с развертыванием кода приложения в экземпляре разработки PAS for OpenEdge, что вы должны сделать в дополнение к развертыванию кода приложения в производственном экземпляре?](https://rupug.pro/questions/по-сравнению-с-развертыванием-кода-пр/) - [Каковы два распространенных варианта принятия учетных данных пользователей в Spring Security?](https://rupug.pro/questions/каковы-два-распространенных-вариант/) - [Какие из следующих утверждений верны для производственного экземпляра PAS for OpenEdge?](https://rupug.pro/questions/какие-из-следующих-утверждений-верны/) - [Что из перечисленного необходимо сделать для использования REST API с целью мониторинга?](https://rupug.pro/questions/что-необходимо-сделать-для-использов/) - [Что необходимо сделать чтобы гарантировать зашифрованную коммуникацию между клиентом и сервером приложений?](https://rupug.pro/questions/что-необходимо-сделать-чтобы-обеспеч/) - [Какие из HTTP-методов поддерживает PAS для классического приложения WebSpeed?](https://rupug.pro/questions/какие-из-http-методов-поддерживает-pas-для-кл/) - [Какие задачи необходимо выполнить для развёртывания приложений WebHandler WebSpeed?](https://rupug.pro/questions/какие-задачи-необходимо-выполнить-дл/) - [Какой файл свойств утилита TCMAN CONFIG открывает только на чтение?](https://rupug.pro/questions/какой-файл-свойств-утилита-tcman-config-открыва/) - [Какое значение необходимо установить свойству defaultHandler (в openedge.properties) для совместимости с классическим WebSpeed?](https://rupug.pro/questions/какое-значение-необходимо-установит/) - [Какие из следующих утверждений истины для PAS с лицензией разработки?](https://rupug.pro/questions/какие-из-следующих-утверждений-истин/) - [Команда TCMAN DELETE используется для удаления экземпляра PAS for OpenEdge.](https://rupug.pro/questions/команда-tcman-delete-используется-для-удаления/) - Из какого каталога вы должны запустить команду TCMAN DELETE? - [Что вы должны сделать в коде приложения для отслеживания изменений в рабочем наборе данных и подготовке их к отправке на сервер для обновления базы данных?](https://rupug.pro/questions/чтобы-вы-должны-сделать-в-коде-приложе/) - Выберите все применимые варианты. - [Какой атрибут вы устанавливаете для набора данных, временной таблицы или поля временной таблицы, если хотите, чтобы имя, записанное или считанное из файла JSON, отличалось от имени, определенного в наборе данных?](https://rupug.pro/questions/какой-атрибут-вы-устанавливаете-для-н/) - Выберите наиболее подходящий ответ - [Предположим, у вас есть набор данных с именем dsOrder, который содержит две временные таблицы, ttOrder и его дочерний элемент, ttOrderLine.](https://rupug.pro/questions/предположим-у-вас-есть-набор-данных-с-и/) - По умолчанию, когда вы вызываете WRITE-JSON, данные набора данных будут записаны в следующей последовательности: каждая запись ttOrder будет записана после соответствующих записей ttOrderLine. Это ложь или истина. - [В каких объектах атрибут ERROR будет установлен?](https://rupug.pro/questions/в-каких-объектах-этот-атрибут-будет-ус/) - Предположим, что серверный код вашего приложения написан так, чтобы позволить системе автоматически устанавливать атрибут ERROR при неудачной попытке приложения вызвать метод SAVE-ROW-CHANGES. Выберите все применимые варианты - [Какие атрибуты используются для контролирования пакетирования в наборе данных?](https://rupug.pro/questions/какие-атрибуты-используются-для-конт/) - Выберите все применимые варианты - [Сколько раз будет вызван обработчик события, когда набор данных заполнится?](https://rupug.pro/questions/сколько-раз-будет-вызван-обработчик-с/) - Предположим, что набор данных содержит две временные таблицы (ttOrder и ttOrderLine) которые связаны с таблицами Order и OrderLine в базе данных. Таблица Order содержит две записи. Первая запись имеет три связанные записи в таблице OrderLine. Вторая запись имеет пять связанных записей в таблице OrderLine. Допустим, что с таблицей ttOrderLine ассоциирован обработчик события BEFORE-ROW-FILL. Выберите наиболее - [Какие события заполнения могут быть обработаны на уровне временной таблицы?](https://rupug.pro/questions/какие-события-заполнения-могут-быть-о/) - Выберите все применимые варианты - [Какой метод должен вызвать клиент для слияния полученного с сервера набора изменений с рабочим набором данных?](https://rupug.pro/questions/какой-метод-должен-вызвать-клиент-для/) - Выберите лучший вариант - [Какой метод должен вызвать серверный код для каждой найденной в BEFORE-TABLE записи для обновления базы данных?](https://rupug.pro/questions/какой-метод-должен-вызвать-серверный/) - Выберите лучший вариант - [Как серверный код обрабатывает изменения?](https://rupug.pro/questions/как-серверный-код-обрабатывает-измен/) - Серверный код получает набор данных от клиента и соответствующим образом обновляет базу данных. Выберите лучший вариант. - [Какие элементы ABL включены в набор данных?](https://rupug.pro/questions/какие-элементы-abl-включены-в-набор-данн/) - Выберите все применимые варианты - [Какой код, который должен использовать наборы данных, вы напишите для серверной части вашего приложения?](https://rupug.pro/questions/какой-код-который-должен-использоват/) - Выберите все применимые варианты - [Какие элементы вы укажите при описании набора данных?](https://rupug.pro/questions/какие-элементы-вы-укажите-при-описани/) - Выберите все применимые варианты - [Какой метод должен быть вызван для заполнения набора данных на сервере?](https://rupug.pro/questions/какой-метод-должен-быть-вызван-для-зап/) - Выберите лучший вариант - [С каким объектом вы должны связать FILL-WHERE-STRING?](https://rupug.pro/questions/с-каким-объектом-вы-должны-связать-fill-where-string/) - Предположим, что вы хотите изменить заполнение набора данных на сервере, указав строку запроса. Выберите лучший вариант - [Какой режим метода FILL установлен по умолчанию?](https://rupug.pro/questions/какой-режим-метода-fill-установлен-по-умо/) - Выберите лучший вариант - [Когда вы должны указать BY-REFERENCE при передаче параметра типа DATASET?](https://rupug.pro/questions/когда-вы-должны-указать-by-reference-при-передач/) - Выберите все применимые варианты - [Какой тип параметра вы должны указать для набора данных в коде серверной процедуры?](https://rupug.pro/questions/какой-тип-параметра-вы-должны-указать/) - Предположим, что серверный код имеет процедуру, которая извлекает данные от имени своих клиентов. Выберите лучший вариант. - [Какой тип параметра вы должны указать для набора данных при вызове процедуры на стороне сервера?](https://rupug.pro/questions/какой-тип-параметра-вы-должны-указать-2/) - Предположим, что клиентский код вызывает серверную процедуру для извлечения данных. Выберите лучший вариант. - [Что вы должны указать в описании набора данных чтобы изменения во всех временных таблицах отслеживались на стороне клиента?](https://rupug.pro/questions/что-вы-должны-указать-в-описании-набор/) - Предположим, ваше приложение использует набор данных из множества временных таблиц. Выберите лучший вариант. - [Распределите следующие задачи в правильном порядке их выполнения](https://rupug.pro/questions/распределите-следующие-задачи-в-прав/) - [Представьте, вам необходимо разделить таблицу Order по полям Country, OrderDate и Channel.](https://rupug.pro/questions/представьте-вам-необходимо-разделит/) - Какую стратегию табличного секционирования вы должны использовать? - [Если коэффициент фрагментации у секции таблицы высокий, то что из следующего вы должны выполнить для устранения фрагментации?](https://rupug.pro/questions/если-коэффициент-фрагментации-у-секц/) - [Какую из следующих утилит вы должны использовать для исправления логических повреждений в локальных индексах?](https://rupug.pro/questions/какую-из-следующих-утилит-вы-должны-ис/) - [Какие из следующих возможностей соответствуют возможностям механизма перестройки индексов в секциях (table-partitioned index rebuild)?](https://rupug.pro/questions/какие-из-следующих-возможностей-соот/) - A Может работать в онлайн. B Активирует все неактивные индексы. C В случае сбоя в работе, доступ к базе по-прежнему возможен. D Вы можете перестраивать локальные индексы параллельно для разных секций. - [Какие из следующих типов секционирования позволяют вам разделить секции?](https://rupug.pro/questions/какие-из-следующих-типов-секциониров/) - A Range B List C List-list D List-range - [Предположим, что таблица PurchaseOrder секционирована по диапазону и одна из её секции имеет название PurchaseOrder_2014. Также предположим, что вы хотите разделить эту секцию на четыре секции, по одной на каждый квартал.](https://rupug.pro/questions/предположим-что-таблица-purchaseorder-секционир/) - Какая, из перечисленных ниже, последовательность задач является правильной для реализации разделения? 1 Добавить четыре секции. 2 Добавить три секции. 3 Активировать секции. 4 Переместить данные в секции. 5 Пометить секции как split-target. - [Какое максимальное количество секций вы можете объединить за один раз?](https://rupug.pro/questions/какое-максимальное-количество-секци/) - [Какую из следующих утилит вы будете использовать для перемещения данных в секции, помеченные как подготовленные к миграции данных?](https://rupug.pro/questions/какую-из-следующих-утилит-вы-будете-ис/) - [Какую из следующих стратегий секционирования реализует политика, описание которой представлено на рисунке?](https://rupug.pro/questions/какую-из-следующих-стратегий-секцион/) - [Когда вы секционируете существующую таблицу, для какого из следующих типов секционирования OpenEdge автоматически создаст описание одной секции?](https://rupug.pro/questions/когда-вы-секционируете-существующую/) - [Что из следующего является секцией, которая содержит существующие данные для всей таблицы и служит источником для миграции данных?](https://rupug.pro/questions/что-из-следующего-является-секцией-ко/) - [Что из перечисленного должно быть в таблице перед тем, как вы сможете выполнить секционирование в ней?](https://rupug.pro/questions/что-из-перечисленного-должно-быть-в-та/) - Допускается выбор нескольких вариантов. - [Предположим, что таблица Order имеет первичный уникальный индекс OrderNum, который основан на столбце OrderNum. Также предположим, что вам необходимо разделить таблицу Order используя стратегию list-range и столбцы OrderDate и Carrier.](https://rupug.pro/questions/предположим-что-таблица-order-имеет-перви/) - Что из перечисленного ниже является правильной последовательностью столбцов, необходимых для определения локального секционно-ориентированного индекса для таблицы Order? - [Что из следующего вы должен указать при определении политики секционирования для новой таблицы с использованием стратегии Range-секционирования?](https://rupug.pro/questions/что-из-следующего-вы-должен-указать-пр/) - [Предположим, что у вас есть секционированная таблица tpPurchaseOrder. На основании политики секционирования этой таблицы вы сгенерировали программу-шаблон create_policy_PO.p. Теперь представьте, что вам необходимо секционировать существующую не секционированную таблицу Invoice. Для этого вам необходимо сделать копию программы-шаблона create_policy_PO.p и изменить её. Вы хотите, чтобы новая секция размещалась в собственной области хранения и была готова к миграции данных.](https://rupug.pro/questions/ii-1-предположим-что-у-вас-есть-секционир/) - Посмотрите на следующий код и укажите, какие из выделенных частей этого кода вы должны изменить для определения новой секции? - [Какую стратегию секционирования реализует следующая политика?](https://rupug.pro/questions/какую-стратегию-секционирования-реа/) - [Какую стратегию секционирования реализует следующий программный код?](https://rupug.pro/questions/ii-2-какую-стратегию-секционирования-ре/) - partitionPolicy = service:NewPartitionPolicy("Invoice"). assign partitionPolicy:Table = service:GetTable("Invoice") partitionPolicy:HasRange = no partitionPolicy:DefaultDataArea = service:GetArea("InvoiceData1") partitionPolicy:DefaultIndexArea = service:GetArea("InvoiceIndex1") partitionPolicy:DefaultLobArea = service:GetArea("InvoiceData1") partitionPolicy:DefaultAllocation = "Immediate" . partitionPolicy:Fields:Add(partitionPolicy:Table:Fields:Find("Carrier")). partitionPolicy:Fields:Add(partitionPolicy:Table:Fields:Find("Country")). partitionPolicy:Indexes:Add(partitionPolicy:Table:Indexes:Find("CarCountLocIdx")). - [Предположим, что таблица Customer содержит ключевые столбцы CustNum, Name, Country и Salesrep, и вы хотите разделить её.](https://rupug.pro/questions/предположим-что-таблица-customer-содержит-кл/) - Какой из этих столбцов будет наиболее подходящим для создания ключа секционирования? - [Какие задачи вы можете выполнить с помощью Database Administration Console?](https://rupug.pro/questions/какие-задачи-вы-можете-выполнить-с-пом/) - [Какие из следующих типов областей хранения необходимо использовать для секций таблицы и её индексов?](https://rupug.pro/questions/какие-из-следующих-типов-областей-хра/) - [Компонент слоя представления Presenter отвечает за](https://rupug.pro/questions/компонент-слоя-представления-view-отвеча/) - [Компонент слоя представления View отвечает за](https://rupug.pro/questions/компонент-слоя-представления-model-отвеч-2/) - [Компонент слоя представления Model отвечает за](https://rupug.pro/questions/компонент-слоя-представления-model-отвеч/) - [Между этими компонентами OERA-архитектуры всегда существует связь 1:1. Какие это компоненты?](https://rupug.pro/questions/между-этими-компонентами-oera-архитектур/) - [При проектировании приложения с применением принципов OERA что вы должны написать для того, чтобы ваши бизнес-компоненты предоставляли сервисы?](https://rupug.pro/questions/при-проектировании-приложения-с-прим/) - [Каково назначение слоя бизнес-компонент?](https://rupug.pro/questions/каково-назначение-слоя-доступа-к-данн/) - [Каково назначение слоя доступа к данным?](https://rupug.pro/questions/каково-назначение-слоя-источников-да/) - [Каково назначение слоя источников данных?](https://rupug.pro/questions/каково-назначение-слоя-корпоративны-2/) - [Каково назначение слоя корпоративных сервисов?](https://rupug.pro/questions/каково-назначение-слоя-корпоративны/) - [Вы предоставили документацию разработчикам, которые собираются использовать OpenEdge OpenAPI для создания клиентских частей ABL-приложения.](https://rupug.pro/questions/вы-предоставили-документацию-разраб-2/) - Какие языки программирования могут использоваться для разработки клиентов? - [С помощью утилиты PROUTIL IDXBUILD можно выполнить переиндексацию онлайн.](https://rupug.pro/questions/с-помощью-утилиты-proutil-idxbuild-можно-выполнить/) - [Использование параметра build indexes для загрузки больших таблиц приводит к ...](https://rupug.pro/questions/использование-параметра-build-indexes-для-загру/) - [Какое минимальное количество фиксированных AI-экстентов вы должны создать в базе данных?](https://rupug.pro/questions/какое-минимальное-количество-фиксир/) - [Расставьте в правильном порядке восстановление БД из резервных копий.](https://rupug.pro/questions/расставьте-в-правильном-порядке-восс/) - [Вы можете выполнить полную проверку резервной копии базы данных онлайн.](https://rupug.pro/questions/вы-можете-выполнить-полную-проверку-р/) - [Предположим, вы используете утилиту PROBKUP для резервного копирования баз данных. Какие из перечисленных ниже необязательных файлов также следует архивировать?](https://rupug.pro/questions/какие-из-следующих-файлов-необходимы-3/) - [Что необходимо сделать прежде чем удалить пустой переменный экстент из области хранения в офлайн?](https://rupug.pro/questions/что-необходимо-сделать-чтобы-удалить/) - [Что из следующего используется для обновления .db файла базы данных?](https://rupug.pro/questions/что-из-следующего-используется-для-об/) - [Конфигурация базы данных может иметь несколько групп серверов.](https://rupug.pro/questions/конфигурация-базы-данных-может-иметь/) - [OpenEdge Explorer позволяет запускать, выполнять мониторинг и останавливать базу данных.](https://rupug.pro/questions/openedge-explorer-позволяет-запускать-выполнять-мо/) - [В OpenEdge Explorer можно добавить только базу данных, расположенную на локальном компьютере.](https://rupug.pro/questions/в-openedge-explorer-можно-добавить-только-базу-данны/) - [Фоновый процесс, который постоянно записывает измененные буферы BI на диск.](https://rupug.pro/questions/фоновый-процесс-который-постоянно-за-2/) - [Фоновый процесс, который постоянно записывает заполненные буферы AI на диск.](https://rupug.pro/questions/фоновый-процесс-который-постоянно-за/) - [Фоновый процесс, который постоянно записывает разблокированные, измененные буферы базы данных на диск.](https://rupug.pro/questions/фоновый-процесс-который-проверяет-фа/) - [Фоновый процесс, который проверяет файл блокировки (.lk) , очищает ресурсы после клиентов и проверяет "жив" ли брокер.](https://rupug.pro/questions/f/) - [Область содержит данные журнала транзакций для двухфазной фиксации (two-phase commit).](https://rupug.pro/questions/область-содержит-таблицы-и-индексы-сх/) - [Область содержит таблицы и индексы схемы БД.](https://rupug.pro/questions/область-содержит-описание-структуры/) - [Область содержит описание структуры базы данных и выступает в качестве таблицы оглавления БД.](https://rupug.pro/questions/номера-областей-которые-могут-содерж-2/) - [Номера областей, которые могут содержать прикладные данные и AI-области.](https://rupug.pro/questions/номера-областей-которые-могут-содерж/) - [Средство графического интерфейса пользователя, используемое в Windows для дампа и загрузки данных, настройки безопасности данных и пользователей, а также настройки политик шифрования.](https://rupug.pro/questions/средство-командной-строки-используе/) - [Средство на основе браузера, инсталлированное с СУБД OpenEdge, которое используется для настройки ресурсов базы данных, запуска и остановки баз данных, а также дампа и загрузки данных.](https://rupug.pro/questions/символьный-пользовательский-интерфе/) - [Область в системной памяти, которую использует СУБД OpenEdge для одновременного доступа нескольких пользователей к базе данных.](https://rupug.pro/questions/область-в-системной-памяти-которую-ис/) - [Процесс базы данных, который инициализирует и выделяет общую память, прослушивает запросы на подключения от клиентов и запускает серверы для удаленных клиентов.](https://rupug.pro/questions/процесс-базы-данных-который-инициали/) - [Процесс, который постоянно записывает разблокированные, измененные буферы базы данных на диск.](https://rupug.pro/questions/процесс-который-постоянно-записывае/) - [Процесс базы данных, который обращается к базе данных через сервер.](https://rupug.pro/questions/процесс-базы-данных-который-обращает-2/) - [Процесс базы данных, который обращается к базе данных непосредственно через общую память.](https://rupug.pro/questions/процесс-базы-данных-который-обращает/) - [Процесс, который автоматически архивирует файлы AI на диск.](https://rupug.pro/questions/процесс-который-автоматически-архив/) - [Коллекция логических структур хранения и физических файлов операционной системы, содержащих постоянные данные на диске.](https://rupug.pro/questions/коллекция-логических-структур-хране/) ## Форумы - [Альтернативный буферный пул Forum](https://rupug.pro/forums/forum/альтернативный-буферный-пул-forum/) - [Механизм After-Imaging в OpenEdge Forum](https://rupug.pro/forums/forum/механизм-after-imaging-в-openedge-forum/) - [Расширенное администрирование СУБД OpenEdge](https://rupug.pro/forums/forum/расширенное-администрирование-субд-opene/) - [Разработка ABL-приложений](https://rupug.pro/forums/forum/разработка-abl-приложений/) - [Базовые основы ABL](https://rupug.pro/forums/forum/базовые-основы-abl/) - [RuPUG HeadHunter](https://rupug.pro/forums/forum/headhunter/) - Предложение о работе, поиск работы для Progress-специалистов. - [Введение в Developer Studio for OpenEdge](https://rupug.pro/forums/forum/введение-в-developer-studio-for-openedge/) - На этом тренинге вы познакомитесь с ключевыми функциями Developer Studio и попрактикуетесь в их использовании. - [Введение в администрирование PAS for OpenEdge](https://rupug.pro/forums/forum/введение-в-администрирование-pas-for-openedge/) - Тренинг представляет собой обзор сервера приложений Progress Application Server for OpenEdge (PAS for OpenEdge) для администраторов баз данных OpenEdge. - [Введение в OpenEdge Table Partitioning](https://rupug.pro/forums/forum/введение-в-openedge-table-partitioning/) - Целью данного курса является изучение ключевых понятий и задач для выполнения секционирования таблиц в базах данных OpenEdge. - [Основы настройки производительности СУБД OpenEdge](https://rupug.pro/forums/forum/основы-настройки-производительности/) - [Основы администрирования СУБД OpenEdge](https://rupug.pro/forums/forum/основы-администрирования-субд-openedge/) - По завершении этого курса и итогам тестирования студентам выдается полноценный действительный электронный сертификат. Поэтому во время регистрации рекомендуется указывать свои реальные данные. - [Использование ProDataSet](https://rupug.pro/forums/forum/использование-prodataset/) - [Программирование на OpenEdge ABL - Best Practices](https://rupug.pro/forums/forum/программирование-на-openedge-abl-best-practices/) - Предполагается, что слушатель данного курса имеет некоторый опыт работы с OpenEdge, или, по крайней мере, знаком с базовыми основами программирования на ABL. ## Темы - [О форуме](https://rupug.pro/forums/topic/о-форуме/) - Этот форум предназначен для обсуждения конструкций языка программирования ABL (4GL). Если у вас есть какие-то вопросы, спрашивайте их здесь. - [Разработчик на ABL (RT)](https://rupug.pro/forums/topic/разработчик-на-abl-rt/) - В крупную российскую компанию (государственное СМИ, Москва) требуются разработчики для расширения функционала проприетарной системы управления предприятием. Оформление полностью официальное. Страховка, обучение, отсутствие командировок, пятидневка. Возможна удалённая работа. Разработчик на ABL Требуется: знание ABL, написание процедур для Application Server. Будет плюсом опыт работы с: PASOE, GUI, OOABL, .NET и знание администрирования Progress. Разработчик на .NET Требуется: - [Администратор Progress OpenEdge (ДБ АО Сбербанк)](https://rupug.pro/forums/topic/администратор-progress-openedge-дб-ао-сбербанк/) - В ДБ АО Сбербанк Казахстан (Алматы) открыта вакансия администратора Progress OpenEdge. Цели и задачи: Администрирование баз данных и других продуктов Progress; Мониторинг баз данных Progress, выявление узких мест, проблем с производительностью, свободным дисковым пространством, устранение причин потенциальных проблем до их возникновения; Выявление неоптимальных запросов со стороны приложений, рекомендации разработчикам по оптимизации запросов; Обновление и патчинг ## Рубрики - [OpenEdge](https://rupug.pro/category/openedge/) - [Статьи](https://rupug.pro/category/posts/) - [Архив](https://rupug.pro/category/archive/) - [Книги](https://rupug.pro/category/books/) - [Обучение](https://rupug.pro/category/education/) - [Конференции](https://rupug.pro/category/conference/) - [Новости](https://rupug.pro/category/news/) - [Администрирование](https://rupug.pro/category/dba/) - [Программирование](https://rupug.pro/category/programming/) - [База знаний](https://rupug.pro/category/dba/база-знаний/) ## Метки - [OpenEdge Replication](https://rupug.pro/tag/openedge-replication/) - [Cloud](https://rupug.pro/tag/cloud/) - [ODBC](https://rupug.pro/tag/odbc/) - [OpenEdge](https://rupug.pro/tag/openedge/) - [OpenEdge Management](https://rupug.pro/tag/openedge-management/) - [Progress Arcade](https://rupug.pro/tag/progress-arcade/) - [Настройка производительности](https://rupug.pro/tag/Настройка-производительности/) - [OpenEdge Security](https://rupug.pro/tag/openedge-security/) - [After-Imaging](https://rupug.pro/tag/after-imaging/) - [Инсталляция](https://rupug.pro/tag/Инсталляция/) - [OpenEdge RDBMS](https://rupug.pro/tag/openedge-rdbms/) - [OpenEdge Transparent Data Encryption](https://rupug.pro/tag/openedge-transparent-data-encryption/) - [Mobile](https://rupug.pro/tag/mobile/) - [PUGChallenge](https://rupug.pro/tag/pugchallenge/) - [BPM](https://rupug.pro/tag/bpm/) - [Progress Community](https://rupug.pro/tag/progress-community/) - [FAQ](https://rupug.pro/tag/faq/) - [PHP](https://rupug.pro/tag/php/) - [Облако](https://rupug.pro/tag/облако/) - [Архитектура OpenEdge](https://rupug.pro/tag/Архитектура-openedge/) - [Конференции](https://rupug.pro/tag/Конференции/) - [Модернизация](https://rupug.pro/tag/Модернизация/) - [OpenEdge Table Partitioning](https://rupug.pro/tag/openedge-table-partitioning/) - [OpenEdge Development](https://rupug.pro/tag/openedge-development/) - [Вебинар](https://rupug.pro/tag/Вебинар/) - [JAVA](https://rupug.pro/tag/java/) - [JDBC](https://rupug.pro/tag/jdbc/) - [Интеграция](https://rupug.pro/tag/Интеграция/) - [Workshop](https://rupug.pro/tag/workshop/) - [ABL(4GL)](https://rupug.pro/tag/abl4gl/) - [Progress Application Server for OpenEdge](https://rupug.pro/tag/progress-application-server-for-openedge/) - [OpenEdge Change Data Capture](https://rupug.pro/tag/openedge-change-data-capture/) - [OpenEdge Multi-Tenancy](https://rupug.pro/tag/openedge-multi-tenancy/) - [JSDO](https://rupug.pro/tag/jsdo/) - [Telerik](https://rupug.pro/tag/telerik/) - [EMEAPUGChallenge](https://rupug.pro/tag/emeapugchallenge/) - [Developer Studio](https://rupug.pro/tag/developer-studio/) - [Database](https://rupug.pro/tag/database/) - [RDBMS](https://rupug.pro/tag/rdbms/) - [Tuning Progress 4GL](https://rupug.pro/tag/tuning-progress-4gl/) - [Upgrade](https://rupug.pro/tag/upgrade/) - [Progress Enhancement Request System](https://rupug.pro/tag/progress-enhancement-request-system/) - [Производительность](https://rupug.pro/tag/производительность/) - [Конвертация](https://rupug.pro/tag/конвертация/) - [Обновление](https://rupug.pro/tag/обновление/) - [PASOE](https://rupug.pro/tag/pasoe/) - [Репликация](https://rupug.pro/tag/репликация/) - [Высокая доступность](https://rupug.pro/tag/высокая-доступность/) - [Отказоустойчивость](https://rupug.pro/tag/отказоустойчивость/) - [Стандарт](https://rupug.pro/tag/стандарт/) - [What’s New](https://rupug.pro/tag/whats-new/) - [Мониторинг](https://rupug.pro/tag/мониторинг/) - [СУБД](https://rupug.pro/tag/субд/) - [версия 12.8 LTS](https://rupug.pro/tag/версия-12-8-lts/) - [оптимизация](https://rupug.pro/tag/оптимизация/) - [администрирование баз данных](https://rupug.pro/tag/администрирование-баз-данных/) - [обслуживание баз данных](https://rupug.pro/tag/обслуживание-баз-данных/) - [резервное копирование](https://rupug.pro/tag/резервное-копирование/) - [архивирование данных](https://rupug.pro/tag/архивирование-данных/) - [проверка целостности данных](https://rupug.pro/tag/проверка-целостности-данных/) - [управление хранилищем данных](https://rupug.pro/tag/управление-хранилищем-данных/) - [дисковое пространство](https://rupug.pro/tag/дисковое-пространство/) - [оперативная производительность](https://rupug.pro/tag/оперативная-производительность/) - [устранение повреждений](https://rupug.pro/tag/устранение-повреждений/) - [оптимизация производительности](https://rupug.pro/tag/оптимизация-производительности/) - [утилита сжатия индекса](https://rupug.pro/tag/утилита-сжатия-индекса/) - [утилита исправления индекса](https://rupug.pro/tag/утилита-исправления-индекса/) - [Управление базами данных](https://rupug.pro/tag/управление-базами-данных/) - [Архиватор AI](https://rupug.pro/tag/архиватор-ai/) - [Восстановление данных](https://rupug.pro/tag/восстановление-данных/) - [Онлайн-архиватор](https://rupug.pro/tag/онлайн-архиватор/) - [Транзакции](https://rupug.pro/tag/транзакции/) - [Утилита управления файлами After-Image](https://rupug.pro/tag/утилита-управления-файлами-after-image/) - [Демоны управления файлами After-Image](https://rupug.pro/tag/демоны-управления-файлами-after-image/) - [Механизмы резервного копирования](https://rupug.pro/tag/механизмы-резервного-копирования/) - [Оптимизация работы с большими базами данных](https://rupug.pro/tag/оптимизация-работы-с-большими-базами/) - [Файлы AI для восстановления](https://rupug.pro/tag/файлы-ai-для-восстановления/) - [Настройка параметров архивации After-Image](https://rupug.pro/tag/настройка-параметров-архивации-after-image/) - [Миграция данных](https://rupug.pro/tag/миграция-данных/) - [PROUTIL](https://rupug.pro/tag/proutil/) - [DUMP](https://rupug.pro/tag/dump/) - [LOAD](https://rupug.pro/tag/load/) - [Размер блока](https://rupug.pro/tag/размер-блока/) - [поддержка устаревших форматов](https://rupug.pro/tag/поддержка-устаревших-форматов/) - [базы данных](https://rupug.pro/tag/базы-данных/) - [Непрерывность бизнес-процессов](https://rupug.pro/tag/непрерывность-бизнес-процессов/) - [PROREST](https://rupug.pro/tag/prorest/) - [Многопоточная обработка](https://rupug.pro/tag/многопоточная-обработка/) - [Обеспечение безопасности данных](https://rupug.pro/tag/обеспечение-безопасности-данных/) - [Управление данными](https://rupug.pro/tag/управление-данными/) - [Оптимизация кода](https://rupug.pro/tag/оптимизация-кода/) - [Реорганизация таблиц](https://rupug.pro/tag/реорганизация-таблиц/) - [Фрагментация данных](https://rupug.pro/tag/фрагментация-данных/) - [Большие данные](https://rupug.pro/tag/большие-данные/) - [Оптимизация баз данных](https://rupug.pro/tag/оптимизация-баз-данных/) - [Структура хранения данных](https://rupug.pro/tag/структура-хранения-данных/) - [Производительность баз данных](https://rupug.pro/tag/производительность-баз-данных/) - [Оптимизация дискового пространства](https://rupug.pro/tag/оптимизация-дискового-пространства/) - [Удаление областей хранения](https://rupug.pro/tag/удаление-областей-хранения/) - [Непрерывная работа](https://rupug.pro/tag/непрерывная-работа/) - [Проверка индекса](https://rupug.pro/tag/проверка-индекса/) - [Онлайн-проверка индекса](https://rupug.pro/tag/онлайн-проверка-индекса/) - [PROUTIL IDXCHECK](https://rupug.pro/tag/proutil-idxcheck/) - [Утилиты для работы с индексами](https://rupug.pro/tag/утилиты-для-работы-с-индексами/) - [Производительность системы](https://rupug.pro/tag/производительность-системы/) - [Кодировка базы данных](https://rupug.pro/tag/кодировка-базы-данных/) - [Параметры сортировки](https://rupug.pro/tag/параметры-сортировки/) - [Файл журнала базы данных](https://rupug.pro/tag/файл-журнала-базы-данных/) - [PROUTIL DESCRIBE](https://rupug.pro/tag/proutil-describe/) - [Виртуальная системная таблица _DbStatus](https://rupug.pro/tag/виртуальная-системная-таблица-_dbstatus/) - [PROBKUP](https://rupug.pro/tag/probkup/) - [многопоточность](https://rupug.pro/tag/многопоточность/) - [конфигурация системы](https://rupug.pro/tag/конфигурация-системы/) - [управление параметрами](https://rupug.pro/tag/управление-параметрами/) - [вторичный брокер](https://rupug.pro/tag/вторичный-брокер/) - [комментарии в параметрах](https://rupug.pro/tag/комментарии-в-параметрах/) - [управление настройками](https://rupug.pro/tag/управление-настройками/) - [сжатие данных](https://rupug.pro/tag/сжатие-данных/) - [экономия ресурсов](https://rupug.pro/tag/экономия-ресурсов/) - [эффективность](https://rupug.pro/tag/эффективность/) - [надёжность данных](https://rupug.pro/tag/надёжность-данных/) - [безопасность данных](https://rupug.pro/tag/безопасность-данных/) - [ZSTD](https://rupug.pro/tag/zstd/) - [ZStandard](https://rupug.pro/tag/zstandard/) - [RLE](https://rupug.pro/tag/rle/) - [Run-Length Encoding](https://rupug.pro/tag/run-length-encoding/) - [Хранение данных](https://rupug.pro/tag/хранение-данных/) - [Оптимизация хранения](https://rupug.pro/tag/оптимизация-хранения/) - [Освобождение места](https://rupug.pro/tag/освобождение-места/) - [Усечение таблиц](https://rupug.pro/tag/усечение-таблиц/) - [Удаление области хранения](https://rupug.pro/tag/удаление-области-хранения/) - [Удаления архивных данных](https://rupug.pro/tag/удаления-архивных-данных/) - [Перемещение данных](https://rupug.pro/tag/перемещение-данных/) - [Утилита PROSTRCT](https://rupug.pro/tag/утилита-prostrct/) - [Утилита PROUTIL](https://rupug.pro/tag/утилита-proutil/) - [Пользовательская сессия](https://rupug.pro/tag/пользовательская-сессия/) - [Отключение пользователя](https://rupug.pro/tag/отключение-пользователя/) - [Завершение работы](https://rupug.pro/tag/завершение-работы/) - [Активный процесс](https://rupug.pro/tag/активный-процесс/) - [Клиентский процесс](https://rupug.pro/tag/клиентский-процесс/) - [Разделяемая память](https://rupug.pro/tag/разделяемая-память/) - [SIGHUP](https://rupug.pro/tag/sighup/) - [SIGQUIT](https://rupug.pro/tag/sigquit/) - [SIGTERM](https://rupug.pro/tag/sigterm/) - [KILL](https://rupug.pro/tag/kill/) - [Устранения неполадок](https://rupug.pro/tag/устранения-неполадок/) - [Сбор диагностических данных](https://rupug.pro/tag/сбор-диагностических-данных/) - [Анализа причин сбоя](https://rupug.pro/tag/анализа-причин-сбоя/) - [Переполнение таблицы локировок](https://rupug.pro/tag/переполнение-таблицы-локировок/) - [Рост Before-Image](https://rupug.pro/tag/рост-before-image/) - [Системные ошибки](https://rupug.pro/tag/системные-ошибки/) - [Системные сбои](https://rupug.pro/tag/системные-сбои/) - [PAS for OpenEdge](https://rupug.pro/tag/pas-for-openedge/) - [REST API](https://rupug.pro/tag/rest-api/) - [OEJMX](https://rupug.pro/tag/oejmx/) - [Health Scanner](https://rupug.pro/tag/health-scanner/) - [Progress OpenEdge](https://rupug.pro/tag/progress-openedge/) - [База данных](https://rupug.pro/tag/база-данных/) - [After-Image](https://rupug.pro/tag/after-image/) - [Before-Image](https://rupug.pro/tag/before-image/) - [Настройка сервера репликации](https://rupug.pro/tag/настройка-сервера-репликации/) - [Мониторинг репликации](https://rupug.pro/tag/мониторинг-репликации/) - [Настройка агентов репликации](https://rupug.pro/tag/настройка-агентов-репликации/) - [Tomcat Manager](https://rupug.pro/tag/tomcat-manager/) - [Apache Tomcat](https://rupug.pro/tag/apache-tomcat/) - [Server Status](https://rupug.pro/tag/server-status/) - [Производительность сервера](https://rupug.pro/tag/производительность-сервера/) - [Настройка PASOE](https://rupug.pro/tag/настройка-pasoe/) - [PROMON](https://rupug.pro/tag/promon/) - [CI/CD](https://rupug.pro/tag/ci-cd/) - [Continuous Integration](https://rupug.pro/tag/continuous-integration/) - [Continuous Delivery](https://rupug.pro/tag/continuous-delivery/) - [Непрерывная интеграция](https://rupug.pro/tag/непрерывная-интеграция/) - [Непрерывное развертывание](https://rupug.pro/tag/непрерывное-развертывание/) - [DevOps](https://rupug.pro/tag/devops/) - [Непрерывная доставка](https://rupug.pro/tag/непрерывная-доставка/) - [Continuous Deployment](https://rupug.pro/tag/continuous-deployment/) - [Среда разработки](https://rupug.pro/tag/среда-разработки/) ## Categories - [Our Team](https://rupug.pro/our_team_category/our-team/) - [Our author](https://rupug.pro/our_team_category/our-author/) ## Метки тем - [Вакансии DBA Progress OpenEdge](https://rupug.pro/forums/topic-tag/вакансии-dba-progress-openedge/) - [ABL](https://rupug.pro/forums/topic-tag/abl/) ## Event Categories - [Оффлайн конференции](https://rupug.pro/tp-event-category/offline-conference/) - [Конкурсы](https://rupug.pro/tp-event-category/competition/) - [Онлайн семинары](https://rupug.pro/tp-event-category/онлайн-семинары/) ## Event Tags - [OpenEdge Multi-tenancy](https://rupug.pro/tp-event-tag/openedge-multi-tenancy/) - [OpenEdge Change Data Capture](https://rupug.pro/tp-event-tag/openedge-change-data-capture/) - [The Successful Six](https://rupug.pro/tp-event-tag/the-successful-six/) - [OpenEdge RDBMS Advanced Enterprise Edition](https://rupug.pro/tp-event-tag/openedge-rdbms-advanced-enterprise-edition/) - [OpenEdge Transparent Data Encryption](https://rupug.pro/tp-event-tag/openedge-transparent-data-encryption/) - [OpenEdge Replication](https://rupug.pro/tp-event-tag/openedge-replication/) - [OpenEdge Management](https://rupug.pro/tp-event-tag/openedge-management/) - [OpenEdge Table Partitioning](https://rupug.pro/tp-event-tag/openedge-table-partitioning/) - [RDBMS](https://rupug.pro/tp-event-tag/rdbms/) - [СУБД](https://rupug.pro/tp-event-tag/субд/) - [OpenEdge Command Center](https://rupug.pro/tp-event-tag/openedge-command-center/) ## Рубрики курсов - [Администрирование](https://rupug.pro/course-category/rdbms/) - [Программирование](https://rupug.pro/course-category/programming/) ## Метки курса - [ProDataSet](https://rupug.pro/course-tag/prodataset/) - [OERA](https://rupug.pro/course-tag/oera/) - [PDSOE](https://rupug.pro/course-tag/pdsoe/) - [PASOE](https://rupug.pro/course-tag/pasoe/) - [СУБД](https://rupug.pro/course-tag/субд/) - [ТЮНИНГ](https://rupug.pro/course-tag/тюнинг/) - [ПРОИЗВОДИТЕЛЬНОСТЬ](https://rupug.pro/course-tag/производительность/) - [ABL](https://rupug.pro/course-tag/abl/) - [After-Imaging](https://rupug.pro/course-tag/after-imaging/) - [Настройка производительности](https://rupug.pro/course-tag/настройка-производительности/) - [PAS for OpenEdge](https://rupug.pro/course-tag/pas-for-openedge/)