![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить текущее значение генератора.. [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, только так.