Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Создание триггера / 17 сообщений из 17, страница 1 из 1
26.07.2015, 16:36
    #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
26.07.2015, 16:44
    #39016173
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера
А если удалена запись с номером 10 из 1,2,3..15?
...
Рейтинг: 0 / 0
26.07.2015, 17:17
    #39016178
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера
Евгений СтронгЯ так понимаю, что для данное цели разумней всего будет написать
триггер, который будет отрабатывать по принципу генератора ID, то бишь перед вставкой.
Нет, для этой цели разумнее всего будет бумажный журнал регистрации порядковых номеров,
откуда специально выделенный человек будет выдавать свободные номера по порядку для
использования исполнителями под роспись. И это - не шутка.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.07.2015, 09:46
    #39016356
Exteris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера
Евгений Стронг
Код: pascal
1.
  DM.qryGennumber.SQL.Text := 'select max(nb) as nb from tren';



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

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

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

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

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

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

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

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


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

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

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

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


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