![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 12.08.2008
Сообщений: 174
|
![]()
Добрый день!
База Firebird 2.0 Имеется таблица KLIENT_UCHET cо следующими полями: KEY_KLIENT_UCHET Integer DATE_1 DATE DATE_2 DATE KEY_KLIENT Integer KEY_USLUGI Integer TYPE_UCHET Integer DATE_1 - начало периода, DATE_2 - конец периода Нужно сделать тригер, чтобы при созданиии новой записи автоматически проставился конец периода для предыдущего значения для этого же клиента и услуги (KEY_KLIENT и KEY_USLUGI), то есть максимальная дата до текущей даты. Я так предполагаю, что должно быть что-то типа этого: Код:
Получается ошибка: Код:
|
![]() |
![]() |
![]() |
#2 |
SQL-коддинг
Участник клуба
Регистрация: 16.01.2009
Сообщений: 1,192
|
![]()
ваще-то не очень хорошая идея
в некоторых субд можно нарваться на мутатинг и что ты будешь делать если вставят запись между уже существующими для одного и того же KEY_KLIENT, KEY_USLUG? если по установленным бизнес-правилам дата_2 предыдущей д.б. на день меньше дата_1 следующей, то может имеет смысл вообще отказаться от второй границы и получать ее в селекте? |
![]() |
![]() |
![]() |
#3 | |
Форумчанин
Регистрация: 12.08.2008
Сообщений: 174
|
![]() Цитата:
Что делать, если вставят запись между уже существующими для одного и того же KEY_KLIENT, KEY_USLUGI? Этот вариант тоже учесть надо. В этом случае точно так же у предыдущей записи должно прописаться DATE_2 = NEW.DATE_1 - 1, а у текущей записи NEW.DATE_2 = ??? Эту дату тоже найти надо. Здесь она будет минимальная после текущей (new.data_1) Так как это можно организовать? И еще вопросик... а что такое мутанинг? |
|
![]() |
![]() |
![]() |
#4 |
SQL-коддинг
Участник клуба
Регистрация: 16.01.2009
Сообщений: 1,192
|
![]()
мутатинг - это когда ты через триггер запускаешь бесконечный цикл обновления таблицы самой себя
к примеру триггер на before_update запускает апдейт той же самой таблицы и так далее по циклу а чтобы не долбиться с выборками - можно написать селективную ХП в принципе, на оракле такой запрос довольно просто строится с использованием аналитических фунок Код:
10 1 1021 01.09.2009 0 05.09.2009 10 1 1021 05.09.2009 2 20 1 1021 03.09.2009 2 05.09.2009 20 1 1021 05.09.2009 2 07.09.2009 20 1 1021 07.09.2009 2 30 2 1021 05.09.2009 3 40 2 1021 01.09.2009 4 50 3 1021 03.09.2009 5 04.09.2009 50 3 1021 04.09.2009 5 60 3 1021 06.09.2009 2 70 4 1021 07.09.2009 0 80 4 1021 09.09.2009 2 90 5 1021 30.09.2009 0 100 5 1021 23.09.2009 1 110 4 1021 13.09.2009 3 120 3 1021 05.09.2009 2 если в ФБ есть любая функа для нумерования набора данных, то можно и по-другому реализовать Последний раз редактировалось soleil@mmc; 22.10.2009 в 13:05. |
![]() |
![]() |
![]() |
#5 | |
Форумчанин
Регистрация: 12.08.2008
Сообщений: 174
|
![]() Цитата:
если Вы говорите, что проще сделать запрос с одной датой, чем то, что я предлагаю, то скажите тогда, пожалуйста, как сделать такой запрос: Выбрать те периоды для конктретного клиента и услуги, в которых type_uchet принимает значение 1 и дата окончания не меньше заданной. Для двух дат у меня запрос такой: Код:
|
|
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 12.08.2008
Сообщений: 174
|
![]() |
![]() |
![]() |
![]() |
#7 |
SQL-коддинг
Участник клуба
Регистрация: 16.01.2009
Сообщений: 1,192
|
![]()
я там выше пост подправил
не факт что запрос будет точно такой же но имхо если получится запросом получить данные, то дальше из этого набора отобрать с учетом фильтра не составит никаких проблем просто тяжело иметь такой головняк с поддержкой целостности границ периодов если есть возможность все сделать через запрос |
![]() |
![]() |
![]() |
#8 | |
Форумчанин
Регистрация: 12.08.2008
Сообщений: 174
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#9 |
SQL-коддинг
Участник клуба
Регистрация: 16.01.2009
Сообщений: 1,192
|
![]()
какая точно версия ФБ?
|
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 12.08.2008
Сообщений: 174
|
![]() |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Изменить данные в базе | SlavaSH | БД в Delphi | 10 | 13.08.2009 14:32 |
Изменить иконку | xakkkkker | Общие вопросы Delphi | 2 | 23.08.2008 19:40 |
Изменить размеры | Манжосов Денис :) | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 2 | 16.05.2008 20:14 |
Не могу изменить данные в DB | aleksey_prm | Помощь студентам | 1 | 17.03.2008 08:21 |
изменить логин | ERASERROR | О форуме и сайтах клуба | 5 | 23.02.2008 08:11 |