powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Получить значение генератора
25 сообщений из 47, страница 1 из 2
Получить значение генератора
    #39429800
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день всем.
Есть 2 таблицы

Таблица замечаний
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
CREATE GENERATOR GEN_ZAUVAG_ID;
CREATE TABLE ZAUVAG (
    ID            BIGINT NOT NULL,
    DATA_ROZGL    DATE NOT NULL,
    DATA_MAIL     DATE,
    DATA_CORRECT  DATE,
    ID_OBLAST     INTEGER NOT NULL,
    ID_RAJON      INTEGER NOT NULL,
    TIP           SMALLINT,
    ID_PROG       INTEGER,
    ZMIST         VARCHAR(2500),
    RESULTS       VARCHAR(1000),
    PRIMER        VARCHAR(20)
);
ALTER TABLE ZAUVAG ADD CONSTRAINT PK_ZAUVAG PRIMARY KEY (ID);

ALTER TABLE ZAUVAG ADD CONSTRAINT FK_ZAUVAG_OBL FOREIGN KEY (ID_OBLAST) REFERENCES OBLAST (ID) ON DELETE SET NULL;
ALTER TABLE ZAUVAG ADD CONSTRAINT FK_ZAUVAG_PRG FOREIGN KEY (ID_PROG) REFERENCES PROGS (ID) ON DELETE SET NULL;
ALTER TABLE ZAUVAG ADD CONSTRAINT FK_ZAUVAG_RAJ FOREIGN KEY (ID_OBLAST, ID_RAJON) REFERENCES RAJON (ID_OBL, ID) ON DELETE SET NULL;
ALTER TABLE ZAUVAG ADD CONSTRAINT FK_ZAUVAG_TIP FOREIGN KEY (TIP) REFERENCES TIP_ZAUVAG (ID) ON DELETE SET NULL;

CREATE DESCENDING INDEX IDX_ZAUVAG_DATE_ROZGL ON ZAUVAG (DATA_ROZGL);
/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/
SET TERM ^ ;
/* Trigger: TR_ZAUVAG_ID */
CREATE OR ALTER TRIGGER TR_ZAUVAG_ID FOR ZAUVAG
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  /* Trigger text */
  if (new.id is null) then
    new.id = gen_id(GEN_ZAUVAG_ID,1);
end
^
SET TERM ; ^


Таблица присланных примеров/файлов
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
CREATE GENERATOR GEN_ATTACH_ID;

CREATE TABLE ATTACH (
    ID           BIGINT NOT NULL,
    ID_ZAUV      BIGINT,
    FILENAME     VARCHAR(250),
    FILECONTENT  BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    TIP_ATTACH   SMALLINT
);
ALTER TABLE ATTACH ADD CONSTRAINT PK_ATTACH PRIMARY KEY (ID);
CREATE INDEX IDX_ATTACH_ZAUVAG ON ATTACH (ID_ZAUV, ID);

/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/
SET TERM ^ ;
/* Trigger: TR_ATACH_ID */
CREATE OR ALTER TRIGGER TR_ATACH_ID FOR ATTACH
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  /* Trigger text */
  if (new.id is null) then
    new.id = gen_id(gen_attach_id,1);
end
^
SET TERM ; ^




Вопрос: При вставке записей в таблицу ZAUVAG генерируется триггером ID. Мне этот ID нужен в таблице прикрепленных файлов. Как получить присвоенный ID без предварительного Commit
--------------------------
Firebird 3.0.1.32609;
IBExpert 2017.3.12.1;
Windows 10 32-bit;
4Gb RAM;
SSD 512Mb + HDD 1 Tb;
Настройки по умолчанию
...
Рейтинг: 0 / 0
Получить значение генератора
    #39429803
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrush,

1. RETURNING
2. Следующее значение генератора можно получать до вставки
...
Рейтинг: 0 / 0
Получить значение генератора
    #39429846
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrush,

http://www.ibase.ru/generator/

p.s. надо будет дописать статью про sequence и проч.
...
Рейтинг: 0 / 0
Получить значение генератора
    #39429853
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,
Я хочу уточни правильно ли я понял.
Мне в программе в переменную нужно получить значение генератора и при вставке в 2 таблицы использовать полученное значение.
Я правильно понял?
...
Рейтинг: 0 / 0
Получить значение генератора
    #39429859
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrush,

либо использовать insert ... returning, как сказал Денис, либо получить значение генератора в программе, и сразу вставить его в таблицу, и дальше это значение использовать как угодно.
...
Рейтинг: 0 / 0
Получить значение генератора
    #39429864
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrush,

какие компоненты или какой язык используется при доступе к базе?
...
Рейтинг: 0 / 0
Получить значение генератора
    #39429872
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrush, kdv имеет в виду, что если у тебя на клиенте формируется некий датасет, предположим, к таблице вида:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE my_rows
(
    row_id INTEGER NOT NULL,
    row_name VARCHAR(200) NOT NULL,
  CONSTRAINT my_rows__pk PRIMARY KEY (row_id),
  CONSTRAINT my_rows__uq UNIQUE (row_name)
);

запросом
Код: sql
1.
SELECT row_id, row_name FROM my_rows

, то запрос с клиента на вставку строки
Код: sql
1.
INSERT my_rows (row_name) VALUES (row_name) RETURNING row_id

поместит присвоенное триггером значение в поле "REC_ID" датасета. В FIBPlus такой финт работает, как в других компонентах доступа к ФБ - не знаю.
...
Рейтинг: 0 / 0
Получить значение генератора
    #39429883
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем.
Приходит просветление :)
Использую ФИБы
...
Рейтинг: 0 / 0
Получить значение генератора
    #39429887
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уточнение:
Вставку делаю через Query. Returning вернет мне значение?
...
Рейтинг: 0 / 0
Получить значение генератора
    #39429910
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrush, вернет, но в этом случае, не пытайся проверять на EOF, а сразу бери значение из поля и проверяй его на "не NULL".
...
Рейтинг: 0 / 0
Получить значение генератора
    #39429941
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
Понял, спасибо, уже пробую
...
Рейтинг: 0 / 0
Получить значение генератора
    #39430138
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
Подскажите.
Не хочу плодить темы, но мой вопрос выплывает из уже обсужденного и решенного.
Работаю с ФБ через ФИБы.
Через Query произвел вставку. Все нормально.
После вставки делаю датасету рефреш - записи не видно. А если датасет закрыть/открыть запись видна.
Я понимаю что ФИБы на просмотр используют отдельную транзакцию.
Суть вопроса - как правильно поступить чтобы увидеть записи.

П.С. Не надо отправлять в ветку Делфи т.к. я знаю что многие из вас знают и ФИБы и Делфи.
...
Рейтинг: 0 / 0
Получить значение генератора
    #39430141
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrush,

А вот и нет, "Дельфи тут никто не знает (с)"
...
Рейтинг: 0 / 0
Получить значение генератора
    #39430142
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
рефрешу нужен ПК, без ПК непонятно, что рефрешить. Как вариант решения проблемы: получать генератор заранее, присвоить его ИДу записи и потом решреш отработает штатно. транзакция пох, что отдельная, но таки да, пишущую перед рефрешем надо закоммитить (предпочитаю руками, лентяи по идее могут и авторефреш выставить, но это на любителя)
...
Рейтинг: 0 / 0
Получить значение генератора
    #39430146
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky,
Так и делаю. Новая строка уже закомичена, но я ее не вижу пока не закрою приложение.
Может нужно правильно ключи читающей транзакции выставить.
...
Рейтинг: 0 / 0
Получить значение генератора
    #39430165
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrush,

прочитай что-нибудь про транзакции, и выставь "правильные ключи". Ты читающей транзакции влепил уровень изолированности snapshot, раз у тебя "записи видны после рестарта приложения". Классические грабли начинающего. Хотя в ФИБПлюс по умолчанию транзакции read_committed.

http://www.ibase.ru/ibtrans/
http://www.ibase.ru/ibx/ (параметры транзакций в фибплюсе точно такие же).
аналогично есть статья про транзакции в фибплюс

еще у меня есть даже видео
https://www. youtube.com/watch?v=n35L7gdw51Q

p.s. предварительно надо хоть что-то читать, и гуглом пользоваться.
...
Рейтинг: 0 / 0
Получить значение генератора
    #39430166
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrush, потому что твоя читающая транзакция не видит изменений пишущей. Надо подтверждать читающую транзакцию.
...
Рейтинг: 0 / 0
Получить значение генератора
    #39430171
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devНадо подтверждать читающую транзакцию.
чего ахинею-то писать? readCommitted прекрасно видит чужие committed-изменения.
...
Рейтинг: 0 / 0
Получить значение генератора
    #39430174
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv, это если у него читающая транзакция read_committed.
...
Рейтинг: 0 / 0
Получить значение генератора
    #39430183
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

а зачем читающей транзакции быть snapshot? тем более, что в фибплюсе, как я уже сказал, по умолчанию read committed?
Я описал причину, ты написал "надо рестартовать". Очень полезный и дельный совет.
...
Рейтинг: 0 / 0
Получить значение генератора
    #39430206
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чайникам не стОит юзать множественные транзакции.
до того как они поймут "нахрена это надо".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Получить значение генератора
    #39430239
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv, rdb_dev
Не надо спорить.
Зашел в настройки читающей транзакции.
Там вообще ничего не было указано - пусто.
Выбрал readcommited.
Ситуацию попустило. Теперь вижу записи если закрыть/открыть датасет.
Рефреш по прежнему не помогает.

2Мимопроходящий:
Верну бумеранг назад.
Не стоит вообще с людьми общаться и давать советы если не можете высказывать свое мнение без всяких там "нахрена" и подобных выражений.
В соседнем топике, где обсуждали изменение ПДФ документа (признаю, Дмитрий, был не прав. Менять не имею права) вообще ругались, а согласно правил форума это запрещено.

Модератор: Если считаете, что правила нарушены - жмите кнопку "Сообщить модератору"
Указывать же, кто что может или нет - это называется "самовольная модерация", и она запрещена
...
Рейтинг: 0 / 0
Получить значение генератора
    #39430257
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Модератор - Намек понят, учту. :)
...
Рейтинг: 0 / 0
Получить значение генератора
    #39430262
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrush...
Ситуацию попустило. Теперь вижу записи если закрыть/открыть датасет.
Рефреш по прежнему не помогает.
...
Ну что за ерунда.

Метод Refresh выполняется только для текущей записи. То есть, на той, на которой стоит курсор.
И Refresh выполняется в контексте либо читающей, либо пишущей транзакции датасета (см. свойство RefreshTransaction).

Чтобы перечитать все данные датасета, следует выполнять FullRefresh. Это примерно то же самое, что "открыть/закрыть", но с автоматическим запоминанием текущей записи и возвратом на нее.
...
Рейтинг: 0 / 0
Получить значение генератора
    #39430267
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,


Спасибо, попробую
...
Рейтинг: 0 / 0
25 сообщений из 47, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Получить значение генератора
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]