7 окт. 2017 г.
28 июл. 2017 г.
DATABASE TRIGGERS в Гедымине
Буквально на днях появится возможность создавать в Гедымине DATABASE TRIGGERS. Такие триггеры могут быть назначены на следующие события:
Окно работает на своей транзакции, которая по итогу или комитится -- кнопка Ок, или отменяется.
Периоды бронирования заносятся в отдельную таблицу (назовем её BOOKINGS). Здесь хранятся начало, окончание, ссылка на номер и ссылка на клиента. Перед добавлением записи происходит проверка не занят ли уже данный интервал.
В редких случаях возможна ситуация, когда два оператора одновременно распределят один и тот же номер на пересекающиеся интервалы. Так как в момент проверки транзакция не увидит запись, добавленную в BOOKINGS другой, еще не подтвержденной, транзакцией.
В такой ситуации на помощь приходит триггер на комит транзакции. Сначала, триггером на добавление/изменений записей в таблице бронирования мы выставим флаг о необходимости проверки при комите текущей транзакции:
Затем, если флаг выставлен, сделаем проверку корректности данных:
- CONNECT
- DISCONNECT
- TRANSACTION START
- TRANSACTION COMMIT
- TRANSACTION ROLLBACK
Окно работает на своей транзакции, которая по итогу или комитится -- кнопка Ок, или отменяется.
Периоды бронирования заносятся в отдельную таблицу (назовем её BOOKINGS). Здесь хранятся начало, окончание, ссылка на номер и ссылка на клиента. Перед добавлением записи происходит проверка не занят ли уже данный интервал.
В редких случаях возможна ситуация, когда два оператора одновременно распределят один и тот же номер на пересекающиеся интервалы. Так как в момент проверки транзакция не увидит запись, добавленную в BOOKINGS другой, еще не подтвержденной, транзакцией.
В такой ситуации на помощь приходит триггер на комит транзакции. Сначала, триггером на добавление/изменений записей в таблице бронирования мы выставим флаг о необходимости проверки при комите текущей транзакции:
CREATE OR ALTER TRIGGER after_ins_update
FOR bookings
ACTIVE
AFTER INSERT OR UPDATE
POSITION 32000
AS BEGIN
RDB$SET_CONTEXT('user_transaction', 'check_tr', 1);
END
Затем, если флаг выставлен, сделаем проверку корректности данных:
CREATE OR ALTER TRIGGER transaction_check
ACTIVE
ON TRANSACTION COMMIT
POSITION 32000
AS BEGIN
IF (RDB$GET_CONTEXT('user_transaction', 'check_tr') = 1) THEN
BEGIN
-- проверяем не пересекаются ли интервалы
-- если пересекаются, то вызываем EXCEPTION
END
END
В тексте исключения можно подробно указать пользователю с каким именно бронированием возник конфликт.
Labels:
база данных,
полезное,
программирование,
Firebird
8 июл. 2017 г.
23 мая 2017 г.
Как не запутаться в зависимостях объектов ПИ
Уже миллион раз успел пожалеть, что сделал в Гедымине режим добавления объектов в ПИ "с зависимыми". Это мощная функция, которая требует от применяющего досконального знания теории реляционных баз данных, структуры конкретной БД, внутреннего устройства своего прикладного решения.
Добросовестная разработка с использованием данной галки требует следования определенной последовательности операций:
-
Добавить объект в ПИ с зависимыми.
Открыть список ПИ. Найти нужное и по-порядку, по списку входящих в него объектов, проверить что именно добавилось. Убрать лишнее.
Открыть список зависимостей для выбранного ПИ и проверить какие зависимости добавились. При необходимости изменить.
Сохранить ПИ в репозиторий.
Взять чистый эталон и загрузить на него пакет (каждый функционально завершенный и обособленный модуль должен быть оформлен в виде пакета).
Протестировать работоспособность загруженного пакета.
-
В такой базе может присутствовать целый букет устаревших, временных, давно забытых ПИ. При добавлении "с зависимостями" они подхватятся и затянутся в список зависимых ПИ.
В таблицах на таких БД могут присутствовать устаревшие, уже не используемые поля. Мало того, что они затянутся в ПИ, так еще затянутся и объекты на которые они ссылаются.
Устаревшие скрипт-функции могут привести к тому, что код, работающий на разработочной базе, не будет работать на чистой базе, собранной из актуальных ПИ.
-
Поскольку решение не велико, то объекты разобъем по следующим ПИ:
-
GS.Зарплата.Наряды.Метаданные -- домены, таблицы, триггеры и т.п.
GS.Зарплата.Наряды.Хранилище -- экранные формы.
GS.Зарплата.Наряды.Макросы -- перекрытые методы, локальные макросы форм.
GS.Зарплата.Наряды.Отчеты -- печатные формы.
-
GS.Зарплата.Наряды.Метаданные зависит от пакета GS.Зарплата.
GS.Зарплата.Наряды.Хранилище зависит от GS.Зарплата.Наряды.Метаданные.
GS.Зарплата.Наряды.Макросы зависит от GS.Зарплата.Наряды.Хранилище.
GS.Зарплата.Наряды.Отчеты зависит от GS.Зарплата.Наряды.Макросы.
Labels:
база данных,
документация,
исходный код,
полезное,
проблема
7 апр. 2017 г.
Большой размер кэша в Firebird 3.0
Сам уже дважды прокололся, поэтому хочу предупредить всех. 2.5 мы используем в режиме Classic и размер кэша не велик. Обычно 2000 страниц. С 3.0 основная идея -- это гигантский кэш, соизмеримый с размером БД, и значительный буфер под сортировку в ОЗУ. Например, при размере памяти сервера 128 Гб мы рекомендуем кэш 64 Гб и 32 Гб под буфер сортировки.
Пока активная база одна, проблем не возникает. Но, при попытке открыть вторую базу (например, чтобы свериться с архивом или испытать экспериментальные функции на тестовой копии), оперативной памяти сервера не хватит на размещение двух кэшей и начнется своппинг в файл подкачки. Производительность сервера драматически снизится.
В таком случае следует уменьшить буфер одной из баз данных с помощью утилиты командной строки:
gfix database_name -user SYSDBA -password sysdba_password -buffers 2000
Labels:
Firebird
31 янв. 2017 г.
15 лет потребовалось, чтобы добавить в Дельфи удобную функцию вставки SQL из буфера, которая в Гедымине появилась еще в начале нулевых. Причем в нашей платформе она работает в обе стороны.
Labels:
цікава
21 янв. 2017 г.
Новые поля в GD_CURRRATE и встроенная функция пересчета валюты
После деноминации курсы некоторых валют (в частности российского рубля) стали такими маленькими, что требуют хранения минимум 6-ти знаков после запятой. Для базы данных всё равно (домен dcurrrate у нас имеет точность до 10-ти знаков после запятой), но если такое значение где-то пройдет через тип Currency сохранятся только четыре знака, т.е. произойдет потеря точности. Мы добавили в таблицу GD_CURRRATE два поля amount и val. Где val -- это курс валюты за количество единиц amount. Теперь для российского рубля можно использовать amount=100 и четыре знака после запятой, как это делает наш Национальный Банк, когда публикует валютные сводки. При amount=1, val=coeff. Пересчет полей происходит на триггере. Весь старый код, который читает или изменяет только поле coeff сохранил свою работоспособность.
Попутно мы внесли следующие улучшения:
-
Для курса валюты можно указать кто его установил. Например, курс Национального банка, курс Валютно-фондовой биржи, курс банка Васи Пупкина и т.п.
Для курса можно указать не только дату, но и время, если курс меняется несколько раз в течение дня.
Labels:
база данных
6 янв. 2017 г.
Проект для исходников документации
У нас более-менее наведен порядок с исходным кодом платформы и прикладных решений, но для размещения исходных файлов документации не применялось никаких правил. Задавшись целью отыскать исходные DOC файлы к инструкциям, которые на нашем сайте доступны в формате PDF, где мы их только не находили. И в затерянных папках на рабочем столе, и вместе с исходным кодом программ, и рядом с клиентскими базами данных.
Пришло время навести порядок с помощью так любимого нами github-а. Создан проект gsbelarus/gedemin-doc, где собраны исходные файлы руководств пользователя и разработчика, учебные пособия, тесты для контроля знаний, презентации, макеты рекламных буклетов и т.п.
В репозиторий включены как финальные редакции, так и неоконченные руководства, черновики. Из музейных соображений мы добавили пособия по программам семейства Анжелика.
Актуальные файлы документации по программам POSitive:Cash & POSitive:Check вынесены в обособленный репозиторий gsbelarus/check-and-cash.
Labels:
документация
28 дек. 2016 г.
Под новый год количество просмотров статей на сайте документации перевалило за 3 миллиона! Это при том, что там же находятся десятки руководств в PDF статистика чтений которых никак не учитывается.
Labels:
цікава
27 дек. 2016 г.
8 дек. 2016 г.
External exception C0000006
Ошибка возникает, когда операционная система не может загрузить нужную ей часть выполняемого файла или динамической библиотеки.
Причиной может быть обрыв сетевого соединения, если выполняемый файл находится на сетевом диске.
Мы добавили в заголовок gedemin.exe, gedemin_upd.exe и gdcc.exe флаг IMAGE_FILE_NET_RUN_FROM_SWAP. Теперь при запуске программы с сетевого диска она будет целиком копироваться в swap файл локального компьютера. Это замедлит процесс начальной загрузки, но позволит избавиться от ошибки в случае обрыва соединения.
Для обновления следует взять архив с нашего сайта и переписать с заменой все файлы из него. Утилита автоматического обновления может не сработать, так как номера версий файлов не изменились.
Следует протестировать новый выполняемый модуль в сетях, где возникала указанная проблема. Если установка флага не поможет, то, возможно, следует аналогичный флаг установить и для всех динамических библиотек, используемых Гедымином.
Также в сети есть информация, что если ошибка появляется при работе в терминальных сессиях Windows Terminal Server 2008, то рекомендуется установить в реестре флаг:
Subkey: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MRxSmb\Parameters
Type: REG_DWORD
Entry: MultiUserEnabled
Value: 1
Type: REG_DWORD
Entry: MultiUserEnabled
Value: 1
Подписаться на:
Сообщения (Atom)

