27 янв. 2014 г.
Проблемы с загрузкой одиночного ПИ
Настройки тянули в себя все объекты по ссылкам и это одна из причин, по которой мы решили от них отказаться в пользу ПИ. В противоположность настройке, при сериализации пространства имен, на диск попадает только то, что непосредственно было включено программистом в ПИ. Если мы игнорируем зависимости ПИ и загружаем одиночный файл, то можем столкнуться с такой ошибкой:
Ее причина проста: в ПИ содержится ссылка на объект, который отсутствует в самом ПИ и в базе данных, или имеет в базе данных другой РУИД. В данном случае проблему вызывает ссылка на папку хранилища GLOBAL\DFM\Tgdc_dlgUserComplexDocument, которая в базе данных имеет РУИД отличный от того, который записан в файле ПИ.
Избежать проблемы можно, если настроить зависимости между файлами ПИ и не использовать загрузку одиночного файла.
Системные объекты, вроде папок хранилища, должны иметь единые стандартные РУИДы, которые у нас записаны в пакете "Общие данные". Данный пакет обязательно должен быть загружен на любую базу, на которой в последствии мы хотим разрабатывать и формировать пространства имен.
24 янв. 2014 г.
14 янв. 2014 г.
В продолжение дискуссии о длине краткого наименования: когда-то вся ширина экрана была 80 символов.
Labels:
цікава
Попытка №2
Упростим ситуацию и будем рассматривать только удаление из базы данных документов указанных типов, даты меньше заданной (D). Под документом в широком смысле мы понимаем:
-
Cовокупность записей в таблице GD_DOCUMENT, шапка и позиции.
Присоединенные к ним записи 1-к-1 (включая записи в специфических таблицах документов, связанные через поле documentkey).
Связанные с ними таблицы с уточняющей информацией (например, USR$INV_ADDINFO). По сути это 1-к-1, но через отдельное поле внешний ключ. Из структуры БД мы не можем знать, что некоторая таблица несет уточняющую информацию, поэтому определим список таких таблиц через константу в программе.
Бухгалтерские проводки (AC_RECORD, AC_ENTRY).
Складское движение (INV_CARD, INV_MOVEMENT).
Ко всему вышеперечисленному связанные записи в кросс-таблицах множеств.
-
Вычисляем бухгалтерские и складские остатки на заданную дату. Сохраняем их в базе.
Формируем массив М из ИД записей, которые останутся в результирующей базе:
-
Сканируем все таблицы, не относящиеся к документам. Добавляем в М ИД записи (если он есть и целочисленный) и идентификаторы всех ссылок на таблицы документов. Прочие ссылки нас не интересуют, так как все записи из прочих таблиц в любом случае будут сохранены.
Выбираем из таблиц документов указанных типов записи с датой больше либо равно D. Сканируем их аналогичным образом, добавляя ИД в М.
Сканируем аналогичным образом таблицы документов остальных типов.
-
Пользователю рекомендуется провести бэкап-разбэкап исходной базы перед началом процесса.
Кэш не должен превышать 500 Мб.
Режим принудительной записи должен быть отключен
Если задействован наш механизм замены внешних ключей, то отключенные ключи должны быть включены.
Аудит средствами платформы Гедымин должен быть отключен.
Labels:
база данных,
идеи,
производительность,
SQL
13 янв. 2014 г.
Labels:
идеи,
полезное,
программирование
4 янв. 2014 г.
Синхронизация данных между мобильным устройством на Android и сервером Firebird SQL
Ради скорости и независимости от сетевого соединения мобильное приложение должно использовать локальную базу, которая периодически синхронизируется с рабочей базой данных предприятия. Пусть мобильная БД состоит из таблиц М1, М2,... Мn и используется только для чтения. Таблицы имеют целочисленные первичные ключи. Рассмотрим вариант однонаправленной синхронизации:
-
Версию данных будем обозначать целым числом и хранить в отведенной для этого таблице. 0 -- соответствует чистой БД.
На сервере создадим таблицы S1, S2,... Sn, идентичные по структуре таблицам из мобильной БД. Указанные таблицы хранят текущую версию данных на сервере.
На сервере создадим GLOBAL TEMPORARY таблицы уровня транзакции T1, T2,... Tn, также как и S идентичные по структуре таблицам из мобильной БД.
На сервере создадим таблицу для команд обновления данных. Каждая запись таблицы хранит в текстовом виде список команд для перевода версии J в версию K.
Команда состоит из заголовка и тела (или только из заголовка). Поддерживаются следующие команды:
-
RALL -- очистить все таблицы.
R -- очистить одну таблицу. В заголовке передается имя таблицы.
D -- удалить записи из таблицы. В заголовке передается имя таблицы. В теле -- список ИД удаляемых записей.
U -- вставить или обновить записи в таблице. В заголовке передается имя таблицы и список полей. В теле передаются значения полей для каждой записи. Первое значение -- всегда ИД записи. Так как присутствие идентификатора обязательно, в списке имя поля первичного ключа не перечисляется.
-
Стартует транзакция.
Сформированные данные данные помещаются в таблицы T.
На основе сравнения S и T создаются и записываются в журнал команды изменения данных от версии N к N + 1.
Таблицы S очищаются, в них переносятся записи из T.
Инкрементируется номер версии данных.
Транзакция завершается.
-
Мобильное приложение подключается к серверу и сообщает свою версию структуры БД и версию данных (V).
Если версия структуры БД нас не устраивает, то сообщаем пользователю, что приложение следует обновить.
Из журнала извлекаем команды для обновления данных от версии V к N и передаем их мобильному приложению.
Если у нас нет прямого перехода от V к N, то последовательно ищем команды для апгрейда от V до V + 1 и формируем из них единый список для инкрементного обновления.
Передаем список команд на мобильное устройство.
По окончании процесса применения полученных команд инкрементируем номер версии данных мобильного приложения.
Если мобильное приложение передало на сервер 0, то вместо передачи длинной цепочки последовательных обновлений, сразу формируем команды на основе содержимого таблиц S.
Процесс обновления выполняется на одной транзакции, которая подтверждается только в случае успешного выполнения всех команд.
Подписаться на:
Сообщения (Atom)