Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить текущее значение генератора.. [D5, IB6.x]


koks ©   (2002-11-14 11:56:00) 

Уважаемые мастера - подскажите...
Добавляю в таблицу данные через TIBQuery с параметрами.
TIBQuery.SQL: INSERT INTO MyTable
Values(:V1, :V2, :V3);

В таблице MyTable есть поле Id, которое обновляется генератором через триггер.

CREATE TRIGGER "CREATE_ID" FOR "MyTable"
ACTIVE BEFORE INSERT POSITION 0
AS BEGIN
NEW.ID = GEN_ID("MyTable_ID", 1);
END

Как мне сразу после TIBQuery.ExecSQL вытащить значение поля id для только что вставленной записи... Неужели отдельным запросом...


KoluChi   (2002-11-14 15:28:00) [1]

>Val © (14.11.02 15:24)
>не для каждого, а там где это нужно.
Я это и имел ввиду.


Val   (2002-11-14 15:24:00) [2]

>KoluChi © (14.11.02 15:09)
не для каждого, а там где это нужно.


KoluChi   (2002-11-14 15:13:00) [3]

>Roma111 (14.11.02 13:36)
>Лично у меня проще
Чем проще? Будет работать только с одной базой (совсем не универсально).



KoluChi   (2002-11-14 15:09:00) [4]

>Val © (14.11.02 14:28)
получится что для каждого генератора надо хпписать, а так получаем универсальную функцию для любого генератора.


Val   (2002-11-14 14:28:00) [5]

есть класичесий вариант, в котором для получения нового значения генератора используется хп, возвращающая его значение, она может вызываться и в триггере при вставке, и вами в приложении, одним словом - где угодно.


Roma111   (2002-11-14 13:36:00) [6]

Лично у меня проще

select gen_id(GEN_ID_EXAM,0) as MaxID
from list_okrug
where id_okrug=0;

естественно подставь названия своего генератора и таблицы, которую можно взять любой "справочник", а "where" нужно, чтобы выводилась одна запись.


koks   (2002-11-14 13:19:00) [7]

да....... извиняюсь - бредовые задал вопросы. Я просто подумал что в данном случае используется TIBQuery. А оказалось - IBSQL, с которым я пока плохо дружу...


koks   (2002-11-14 12:14:00) [8]

Большле спасибо
Толбко вопрос: для чего нужна
{$IFDEF FIELD_BY_NAME_AS_FUNC}
Value := ibsql_GetGenerator.FldByName["GEN_VALUE"].AsInteger;
{$ELSE}
<< то же самое >>
{$ENDIF}

и почему SELECT выполняется методом ExecSql, а не open.

и еще вопрос в догонку - нужно ли с запросом ibsql_GetGenerator связывать отдельную транзакцию...


KoluChi   (2002-11-14 12:01:00) [9]

Получить значение генератора
function ...(const GeneratorName: String; var Value: Integer): Boolean;
begin
Result := false;
ibsql_GetGenerator.Close();
ibsql_GetGenerator.SQL.Text :=
"SELECT GEN_ID(" + UpperCase(GeneratorName) + ", 0) AS GEN_VALUE " +
"FROM RDB$GENERATORS GEN " +
"WHERE GEN.RDB$GENERATOR_NAME=" + QuotedStr(UpperCase(GeneratorName));
try
ibsql_GetGenerator.Transaction.StartTransaction();
ibsql_GetGenerator.ExecSQL();
{$IFDEF FIELD_BY_NAME_AS_FUNC}
Value := ibsql_GetGenerator.FldByName["GEN_VALUE"].AsInteger;
{$ELSE}
Value := ibsql_GetGenerator.FieldByName["GEN_VALUE"].AsInteger;
{$ENDIF}
ibsql_GetGenerator.Transaction.Commit();
Result := true;
except
ibsql_GetGenerator.Transaction.Rollback();
end;
ibsql_GetGenerator.Close();
end;


KoluChi   (2002-11-14 12:01:00) [10]

>Неужели отдельным запросом...
IMHO, только так.


Наверх

Титульная страница Поиск, карта сайта Написать письмо