Страница 1 из 1

Формирование идентификатора

СообщениеДобавлено: 06 дек 2018, 09:06
gavryl
Здравствуйте.
Интересует вопрос формирования идентификатора записей в базе данных для Бизнес-классов, в особенности "TgdcAttrUserDefained" и "TgdcUserDocument".
Как он формируется? Как он должен формироваться?

Есть необходимость формирования идентификатора с помощью SQL запроса.

Re: Формирование идентификатора

СообщениеДобавлено: 07 дек 2018, 15:30
sysdba
1. TgdcAttrUserDefined -- базовый класс для справочников, созданных пользователем. Подтип у него -- это имя таблицы справочника.

2. TgdcUserDocument -- базовый класс для документов пользователя. Подтип у него это РУИД типа документа, который можно отыскать в таблице GD_DOCUMENTTYPE.

Re: Формирование идентификатора

СообщениеДобавлено: 09 дек 2018, 15:08
gavryl
Судя по ответу, я не правильно задал вопрос. Попробую по другому.

Например. Возьмём бизнес-класс TgdcValue (справочник Единиц измерения). Главной (и единственной) таблицей является таблица GD_VALUE. Судя по триггеру этой таблицы идентификатор формируется согласно двум генераторам: "NEW.ID = GEN_ID(gd_g_unique, 1) + GEN_ID(gd_g_offset, 0)". Причём первый генератор каждый раз увеличивается на единицу, а второй сам по себе равен нулю и не изменяется.

Если я выполню запрос: "Insert Into gd_Value (Name) Values ('ИмяЕдИзм')", то так и произойдёт, а именно:
генератор gd_g_unique увеличится на единицу и результат запишется в поле id таблицы gd_Value.
Но если я открою как пользователь таблицу "Единицы измерения" и в ней добавлю строчку, то поле id приобретёт совсем другое, но близкое к генератору gd_g_unique значение. При чём генератор gd_g_unique никак не измениться.
Это же происходит и в TgdcAttrUserDefined, и в TgdcUserDocument, и, скорее всего, и во всех Бизнес-объектах.
При этом идентификаторы сформированные в бизнес-объектах не повторяются.

Почему в Бизнес-классе идентификатор другой?
Или я уже что-то "нахимичил" :) с базой данных?

*.ехе файл у меня конца 2012 года. Версия файла БД: 0000.0001.0000.0193

Re: Формирование идентификатора

СообщениеДобавлено: 11 дек 2018, 15:52
sysdba
Значение генератора кэшируется для скорости, чтобы не дергать базу каждый раз, когда создается объект. Поэтому при создании объекта из Гедымина он получает ИД из кэша.

Re: Формирование идентификатора

СообщениеДобавлено: 11 дек 2018, 16:48
gavryl
А к ИД из кэша с помощью запроса я не доберусь...?

Re: Формирование идентификатора

СообщениеДобавлено: 11 дек 2018, 17:22
sysdba
нет, а зачем вам? если в макросе надо получить следующее значение ИД, то там есть функция GetNextID.

Re: Формирование идентификатора

СообщениеДобавлено: 12 дек 2018, 10:00
gavryl
Просто мне нужно работать с базой данных удалённо. Изменять или записывать в ней некоторые данные. Обычное подключение не получается (подключение происходит через интернет). Долго грузит поля таблиц. Подождал десять минут и завершил задачу. Хотя когда-то мне приходилось организовывать подключение даже с помощью обычного модема, - работали некоторое время.
Подключение через удалённый рабочий стол не подходит. Требует много ресурсов. Рассматривается как крайняя мера.
Остаётся пользоваться запросами с помощью класса TIBSQL или TIBQuery.

А чтобы решить вопрос с идентификаторами в удалённой базе данных, нужно чтобы никто не подключался к ней обычным способом, а только удалённо.

Благодарю за помощь.

Re: Формирование идентификатора

СообщениеДобавлено: 12 дек 2018, 10:02
sysdba
Странно, что у вас не получается с удаленными столами. Это обычная схема, которую используют наши клиенты через одного.

Re: Формирование идентификатора

СообщениеДобавлено: 12 дек 2018, 10:10
gavryl
С удалёнными столами получается. Но, нужно шаманить с операционкой.
Да и по другим соображениям не хочется использовать рабочие столы.