powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Создание триггера
17 сообщений из 17, страница 1 из 1
Создание триггера
    #39016170
Здравствуйте! Подскажите пожалуйста, ситуация такая. Имеется таблица с ключом ID и еще одно поле с порядковым номером. Он всегда должен быть порядковым, т.е. 1,2,3,4,5 и т.д. Допустим в ситуации с ID, если запись с номером 15 удалена, то следующая сгенерится с номером 16. В моем случае триггер должен понимать, что максимальное значение 14, поэтому следующая будет под номером 15. Данная возможность была реализована в delphi, а на данный момент переписываю ПО под firebird и всю логику переношу на ХП. Писал функцию:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
function TrenNumber: Integer;
var maxnb : Integer;
begin

  DM.qryGennumber.Close;
  DM.qryGennumber.SQL.Text := 'select max(nb) as nb from tren';
  DM.qryGennumber.Open;

  maxnb := DM.dsGennumber.DataSet.FieldByName('nb').AsInteger;

  Result := maxnb + 1;



Ну я думаю тут понятно. Находится максимальное значение, прибавляет 1 и возвращает результат. Собственно вопрос. Я так понимаю, что для данное цели разумней всего будет написать триггер, который будет отрабатывать по принципу генератора ID, то бишь перед вставкой. Или можно сам генератор для ID дописать, чтобы не создавать второй. Вот хотелось бы пример. Как это можно реализовать. Спасибо!
...
Рейтинг: 0 / 0
Создание триггера
    #39016173
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если удалена запись с номером 10 из 1,2,3..15?
...
Рейтинг: 0 / 0
Создание триггера
    #39016178
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений СтронгЯ так понимаю, что для данное цели разумней всего будет написать
триггер, который будет отрабатывать по принципу генератора ID, то бишь перед вставкой.
Нет, для этой цели разумнее всего будет бумажный журнал регистрации порядковых номеров,
откуда специально выделенный человек будет выдавать свободные номера по порядку для
использования исполнителями под роспись. И это - не шутка.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Создание триггера
    #39016356
Фотография Exteris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Стронг
Код: pascal
1.
  DM.qryGennumber.SQL.Text := 'select max(nb) as nb from tren';



Как этот запрос поможет вам найти "дырку"?

Есть более другой запрос, который это умеет, тоже с max/min. Но и с ним вы огребете проблем при многопользовательской работе.
...
Рейтинг: 0 / 0
Создание триггера
    #39016413
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Стронгразумней всего будет написать триггер, который будет отрабатывать по принципу генератора
в данной ситуации не разумней, потому что триггеры работают в контексте транзакций, где произошло действия, и конкурирующих действий или изменений никак не видят.

Евгений СтронгНаходится максимальное значение, прибавляет 1
грабли, на которые вы наступаете, известны уже несколько десятилетий.
...
Рейтинг: 0 / 0
Создание триггера
    #39016414
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovдля этой цели разумнее всего будет бумажный журнал регистрации порядковых номеров,+плюс явно описанный в соответствующем приказе по предприятию бизнес процесс.
...
Рейтинг: 0 / 0
Создание триггера
    #39016812
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНет, для этой цели разумнее всего будет бумажный журнал регистрации порядковых номеров,
откуда специально выделенный человек будет выдавать свободные номера по порядку для
использования исполнителями под роспись. И это - не шутка.
Ну уж не перегибай. Бумажный вполне себе заменяется электронным, и даже автоматическим.
...
Рейтинг: 0 / 0
Создание триггера
    #39019912
Фотография tanyxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если важна именно сквозная нумерация (сильно похоже на требования налогового законодательства с формированием их реестров), то журнал - действительно лучший вариант. Мы в конце концов пришли именно к этому
...
Рейтинг: 0 / 0
Создание триггера
    #39020585
мастер_ёда
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Стронг,

Если требуется "бездырочная" нумерация документов, то создай таблицу "дырок",
куда будут записываться, при удалении, номера этих самых "дырок".
При создании нового документа, ищи в таблице "дырок" запись с минимальным номером,
а когда новый документ внесётся в базу, "дырку" удаляй.
Как то так....
...
Рейтинг: 0 / 0
Создание триггера
    #39020615
Фотография zirra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мастер_ёда> Если требуется "бездырочная" нумерация документов, то создай таблицу "дырок",
> куда будут записываться, при удалении, номера этих самых "дырок".
А может тогда уж "признак дырки"?.. И пользовать минимальный...
Ы?.. ;-)

--
Vladimir A.Bakhvaloff
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Создание триггера
    #39020626
мастер_ёда
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zirra,

Можно и так. Но если запись удаляется (физически), то куда ставить признак дырки?
...
Рейтинг: 0 / 0
Создание триггера
    #39020632
Фотография zirra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мастер_ёда> Можно и так. Но если запись удаляется (физически), то куда ставить признак дырки?
Вспомни dBase, создай поле DELETED и не удаляй физически...
Главное, дочерний документ тоже не прибивать физически...

--
Vladimir A.Bakhvaloff
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Создание триггера
    #39020638
мастер_ёда
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zirra,

Это понятно. Но вопрос гипотетический: нужно в кортеже иметь бездырочную нумерацию элементов.
Абстрагируйтесь от всяких счёт-фактур, ордеров и прочего бухгалтерского хлама :)
...
Рейтинг: 0 / 0
Создание триггера
    #39020643
Фотография zirra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мастер_ёда> Это понятно. Но вопрос гипотетический: нужно в кортеже иметь бездырочную нумерацию элементов.
> Абстрагируйтесь от всяких счёт-фактур, ордеров и прочего бухгалтерского хлама :)
Да был ведь здесь топик про бездырочную нумерацию... Причём неоднократно...
....
У нас в конторе была сквозная... А для долбоклюев из проверочных органов - сохраняли с/ф и остальное, что было "уничтожено"...
С причиной отказа с любой стороны и печатями...


--
Vladimir A.Bakhvaloff
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Создание триггера
    #39020726
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мастер_ёданужно в кортеже иметь бездырочную нумерацию элементов
это значит
- использовать генератор
- никогда не использовать rollback (отмену), чтобы значение генератора было сохранено в записи
- никогда не удалять записи.

Все.
...
Рейтинг: 0 / 0
Создание триггера
    #39020728
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Kdv!
You wrote on 31 июля 2015 г. 17:39:34:

Kdv> - никогда не использовать rollback (отмену)
а обрывы? а падения?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Создание триггера
    #39020730
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

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


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