Содержание
Contents
Содержание#
- Введение
- Предисловие
- Обзор
- Начало работы с фреймворком
- Языки разработки
- Сессия приложения
- Взаимодействие с базой данных
- Классы
- Класс
- Сервисные возможности для классов
- Служебные атрибуты
- Автонумерация
- Копирование объектов
- Группировка
- Сервис прикрепленных файлов
- Поиск по шаблону
- Объектные характеристики
- Аудит
- Автоматическая генерация штрих-кодов объекта
- Подписи объектов для печати
- Полнотекстовый поиск
- Пообъектный доступ
- Сервис универсальных коллекций
- Денормализация классов-деревьев
- Настройки приложения
- Вставка изображений в прикреплённый файлы типов word и pdf
- Справочник параметров
- Тип объекта
- Выборки
- Выборка
- Отображения
- Отношение экземпляров выборок
- Доступность параметров главных выборок в подчиненных выборках
- Передача параметров в выборку
- Открытие выборок в различных режимах
- Разметка выборки
- Операции
- Диалоги
- Фрейм
- Мультиселект
- Настройка стилей
- Создание строки стиля. StyleBuilder
- Жизненный цикл формы
- Иконки
- Частично-загружаемые деревья
- Пример разметки выборки
- Сервис группового редактирования
- Универсальный фильтр
- Основные положения
- Доступные элементы для фильтрации
- Формирование макроса
- Передача условий фильтра через параметры выборки
- Описание scala-классов, используемых фильтром
- Расширенная настройка
- Класс
- Коллекции
- Выборка
- Создание дополнительных групп фильтрации
- Связь панели стандартного фильтра с универсальным фильтром
- Добавление атрибута через панель доступных для фильтрации атрибутов УФ
- Добавление произвольного атрибута
- Режим «Только сохранение»
- Принудительная отправка значения в универсальный фильтр
- Управление возможностью редактирования значения атрибута в универсальном фильтре.
- Значение по умолчанию
- Передача значений фильтра через параметры выборки
- Получение значения атрибута фильтра
- Формирование макроса
- MDA-таблица
- Аудит открытия форм и выполнения операций
- Выборка
- Инструменты
- Конфигуратор
- Работа в IntelliJ IDEA
- Отладка приложений
- Тестирование
- Горячие клавиши
- Отчеты
- Отчеты
- Jasper Reports
- Дистрибутив
- Jaspersoft Studio
- Обучающее видео
- Документация JasperReports
- Пользовательский интерфейс
- Колонки
- Bands
- Настройка среды Jaspersoft Studio
- Проект отчета
- Создание простой печатной формы
- Двухуровневый отчёт (мастер-деталь)
- Отчет книга (Report Book)
- Параметризация шаблонов
- Экспорт
- Построение отчёта на основе JSON-данных
- Скриптлет (Scriptlet)
- Публикация отчётов в БД
- Отчет с содержанием
- Шаблоны отчетов
- Организация разработки
- Основные понятия
- Проект
- Релизы
- Работа с Git
- Развёртывание рабочего места под Linux
- Дополнительно
- Локализация приложений
- Логирование
- Проектные расширения
- Интеграция с сервером
- Параллельные вычисления
- Асинхронное обновление данных в связанных классах
- Средства мониторинга работы системы.
- Структуры аудита
- Аудит классов
- Журнал блокировок базы данных
btk_dblockshistory
- Журнал аудита сторонних систем
btk_idextaudit
- Журнал выполнения работ
btk_jobexechistory
- Журнал информации о работе БД
btk_monitordbactivityaud
- Журнал выполнения медленных задач
btk_slowqueryhistory
- Журнал размера таблиц основных классов
btk_tablesizehistory
- Журнал открытия выборок и выполнения операций
selopenhistory
- Журнал аудита JEXL
jexlexechistory
- Логирование CEF
- Сервисы сервера приложений
- SSH консоль сервера
- WebSocket консоль сервера
- Jexl через SOAP XML
- Jexl через REST API сервис c использованием прикладных пакетов
- REST сервис c обработкой http-запроса в прикладном пакете
- REST-сервис для взаимодействия с пользовательскими сессиями
- Сервис отчётов
- Аутентификация в REST/SOAP сервисах
- Администрирование Rest-сервисов
- Администрирование SOAP-вызовов
- Приложение
- Практические советы
- Создание выборки без класса
- Создание avm-файла для выборки без класса
- Проектное переопределение
- Наследование базовой логики
- Проектные переопределения
- Работа с данными, хранящимися в jsonb контейнере
- Атрибуты, хранящиеся в jsonb контейнере
- Получение и установка атрибутов, хранимых в json
- Универсальные характеристики(UC)
- Чтение и запись иных данных в json контейнер
- Примечания по работе с jsnonb контейнерами
- Работа с контейнером jObjAttrs_dz
- Работа с обобщенными json контейнерами в Postgres
- Классы-расширения. Simple Extensions
- Запуск отладки/теста
- Как вносить изменения
- Как обновить внешние зависимости
- Как переопределить методы API
- Как переопределить методы AVI
- Как переопределить сеттеры API
- Как переопределить сеттеры AVI
- Как сбросить кэш
- Как собрать проект
- Как создать класс
- Как создать коллекцию
- Как создать новое отображение
- Как создать точку расширения
- Найти и открыть класс из настройки системы
- Настройка автонумерации
- Настройка группировки класса
- Поиск по коду в Idea
- Создание логического атрибута класса
- Практики разработки
- Полезные практики от опытных разработчиков
- Практика Avi
- Про
selectStatement
иonRefreshExt
- Объектный запрос
- Добавление нехранимых полей
- Нехранимые строки
- Динамическое присоединение столбцов
- Динамическое изменение свойств avm
OnrefreshExt
и значение даты с выборки- Поиск отображения на выборке
- Пользовательская блокировка
- Объект класса в процессе создания и другие состояния объекта rop
- Как узнать, что выборка является главным меню или главной выборкой формы
- Про
- Практика SQL
- Практика avm, примеры интерфейсов
- Практика odm
- Практика код
- Вычисление суммы без использования буфера
- Группировка объектов с использованием null-типов
- Сравнение диапазона дат
- .distinct или .toSet для scala-коллекций и особенности применения
immutable.Map.builder
вместоmutable.Map
- Признак наличия модуля на проекте
- Когда использовать ASQL/ ASelect/ OQuery/ TxIndex/ refreshByParent и byParent у коллекций
- Практики при разработке документов
- Разработка под высокую нагрузку
- Работа с кэшем
- Применяйте правильно byParent и byKey, вместо refreshByParent и refreshByKey
- Применяйте правильно Session.commit, Session.commitWork, flush и flush(true), чтобы не достичь лимита загружаемых ячеек
- Загрузка множества объектов
- Используйте предварительную прогрузку данных в кэш через batchIn и queryKeys
- При массовой обработке объектов используйте Btk_BulkProcessPkg().chunkedQuery
- При массовой регистрации объектов используйте Btk_BulkProcessPkg().findObjects.
- Scala код
- Используйте View или withFilter, чтоб избежать создания временных коллекций
- Избегайте использования filter несколько раз подряд
- Используйте lazy val
- Используйте коллекции, имеющие оптимальную сложность поиска, взамен обладающих линейной при частом обращении за нахождением
- На while и рекурсии добавляйте защиту по кол-ву итераций
- Не эмулируйте существующие методы работы с коллекциями
- Используйте ArrayBuffer вместо ListBuffer
- При проверке на существование - не прибегайте к фильтрации
- При проверке на пустоту - не вычисляйте длину
- В checkWorkability (CWA) используйте getVar вместо обращений к БД (ASelect, ATSQL, OQuery, Load, byParent, byKey и т.д.)
- Избегайте использовать copyAro
- В Avi пишите только бизнес логику для взаимодействия с пользователем, все остальное выносите в методы Api
- Не пишите длинные выражения и запросы в одну строчку
- Создавайте общие trait без реализации для разных отображений с одинаковой функциональностью
- Создавайте библиотеки для использования общих методов в различных выборках
- Не используйте поля Tuple, а по возможности пользуйтесь экстрактором
- Используйте «.lastOption, .headOption, dropRight(1), .drop(1), .reduceOption» вместо «.last, .head, .init, .tail, .reduce»
- Не складывайте строки через +, используйте строковую интерполяцию
- При сборе сложной строки не создавайте много промежуточных результатов
- Используйте Option при работе с пустыми (null) ссылками
- Избегайте выполнения запросов внутри вложенных циклов
- Используйте параллельные вычисления, если требуется множественная обработка независимых объектов
- Sql запросы
- Просматривайте план выполнения запроса, чтобы узнать проблемные места
- При написании сложных запросов дробите его на части и используйте подзапросы
- Используйте индексы, чтобы ускорить получение запрашиваемых данных
- Используйте параметры при передаче значений в запрос
- При группировке минимизируйте кол-во группируемых полей
- Фильтруйтесь по индексируемым полям, вместо служебных полей
- При соединении таблиц по идентификаторам, избегайте различных преобразований
- Используйте правильное приведение типов, в соответствие, с типом данных поля
- Добавляйте защиту от зацикливания в рекурсивных запросах
- Работа с кэшем
- Практические советы