powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужен триггер для вычислений между строками
11 сообщений из 11, страница 1 из 1
Нужен триггер для вычислений между строками
    #32028886
Klimov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые знатоки, просит совета человек уже прямоходящий, но пока ещё не Sapiens (хорошо, что начальник об этом не знает)!

Необходимо вычислять разницу между smalldatetime по такому принципу:

структура таблицы:

kamp d_otkl d_podkl srok_mi ele
1 . . : 03.02.1984 15:03 NULL 1
2 02.05.1988 03:00 17.05.1988 06:32 1234567 1
3 03.09.1989 07:59 18.09.1989 23:00 7654321 1
4 12.04.1993 15:26 26.04.1993 08:56 9876543 1
5 21:04.2002 22:12 . . : 1234567 1

Надо Update srok_mi в строке, где kamp=2 разницей (d_otkl из kamp=2)-(d_podkl из kamp=1)
Update srok_mi в строке, где kamp=3 разницей (d_otkl из kamp=3)-(d_podkl из kamp=2)
Update srok_mi в строке, где kamp=4 разницей (d_otkl из kamp=4)-(d_podkl из kamp=3)
................................................... и т. д.

Это безобразие надо делать при заполнении,редакт. задним числом полей d_otkl, d_podkl.
Как лучше сделать? С помощью курсоров, или ещё как можно? С курсорами я сейчас копаюсь, но в книгах вычитал, что это дурной тон...

Буду признателен за идеи.

P.S Поле ele здесь не зря. Я сочинил выборку по оному ele, в жизни их около 900. Реальное число строк сейчас около 2 000, скорость пополнения(редактирования) - 2-3 строки в день, в общем это - бесконечный медленно растущий справочник.
...
Рейтинг: 0 / 0
Нужен триггер для вычислений между строками
    #32028888
Faza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в чем проблема поставить это на триггер. Ты и сам подал идею.
Единственное но - должна быть точка выхода из триггера. Или условие, по которому он буде срабатывать, например при изменении только вышеназванных полей.
...
Рейтинг: 0 / 0
Нужен триггер для вычислений между строками
    #32028894
Klimov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>> Faza
Сложности пока представляю приблизительно. В QA пока всё работает за исключением перехода через 2000 год - отрицат. datediff() получается, но на это есть BOL... Читаю вот.

Меня интересовало, самый ли оптимальный вариант здесь работать с курсорами? Можно ли по-другому выкрутиться?
Дело в том, что подобных задач у меня впереди много, и в курсоры там будет влетать не по три-пять строк, а по 2-3 сотни и не 2-3 раза в день, а непредсказуемо пока... Не "заткну" ли я тогда своими курсорами сервер?
Хотелось бы сразу встать на самые оптимальные рельсы..

Спасибо за внимание к DOSовскому Foxисту. С уважением Андрей.
...
Рейтинг: 0 / 0
Нужен триггер для вычислений между строками
    #32028899
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Нужен триггер для вычислений между строками
    #32028925
Klimov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>Glory
Увы, увыжаемый Glory, если я правильно понял рекомендуемый Вами топик
http://www.sql.ru/cgi-bin/UltraBoard/UltraBoard.pl?Action=ShowPost&Board=mssql&Post=4225&Idle=365&Sort=0&Order=Descend&Page=8, это не совсем то.
1. Ни одному из столбцов таблицы я не могу поставить pk. Not NULL может быть только kamp, но он уникален только в пределах ele, которых у меня 824 если быть точным.
2. Фокус с двойным равенством интересен (постараюсь запомнить), но результат д.б. прописан в srok_mi вычислением не суммы(разности) по самому вычисляемому столбцу, а вполне конкретной разности м. двумя соседними столбцами лишь логически расположенных рядом двух строк.

Пока мне кажется, что в рекомендуемом Вами топике прав qu-qu, говоря "грузите промежуточные данные во временную таблицу, указав ORDER BY по дате и все просуммируется правильно". По сути это курсор и есть, от которых я хотел избавиться... Или я не понял чего-то?

3. Уже не к T-SQL. А как Вы так быстро находите нужные топики? Просто на память, или есть какой-то механизм? А то я часто мучаюсь "где-то видел (У вас же на SQL.RU)", а найти не могу.

Спасибо за участие. С уважением Климов А.
...
Рейтинг: 0 / 0
Нужен триггер для вычислений между строками
    #32028933
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю, нужно рассчитать разницу между включениями/выключениями чего-то ?
Единственно, что меня смущает так это нахождение "вполне конкретной разности м. двумя соседними столбцами лишь логически расположенных рядом двух строк". Это как - логически ?

Если это просто kamp на 1 меньше чем у текущей записи, то так
\ncreate table #t (kamp int, d_otkl datetime, d_podkl datetime, srok_mi int, ele int)

insert #t values(1, NULL, '19840203 15:03', NULL, 1)
insert #t values(2, '19880502 03:00', '19880517 06:32', 1234567, 1)
insert #t values(3, '19890903 07:59', '19890918 23:00', 7654321, 1)
insert #t values(4, '19930412 15:26', '19930426 08:56', 9876543, 1)
insert #t values(5, '20020421 22:12', NULL, 1234567, 1)

select *, cast(a.d_otkl as real) - (select cast(b.d_podkl as real) from #t b where b.kamp = (a.kamp-1))
from #t a

drop table #t



Ну а насчет быстрого поиска, так я уже давно "собираю" интересные топики в My Favorites
...
Рейтинг: 0 / 0
Нужен триггер для вычислений между строками
    #32028982
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант, можно использовать не простые триггеры, а Instead-триггеры. Они гарантированно не приводят к рекурсии (а ведь для других таблиц рекурсивные триггеры вполне могут поднадобиться, что требует в простых триггерах дополнительных средств защиты от нежелательной рекурсии).
Glory высветил весьма забавный нюанс. Если взглянуть на задачу "так сказать, вообще", то в одной команде Update может присутствовать модификация одновременно нескольких полей одновременно нескольких соседних записей. Не то, чтобы это какая-то серьезная проблема, даже совсем не проблема. Просто нужно сразу продумать такой вариант развития событий и однозначно определиться, во всех ли случаях корректно работает алгоритм. В частности, ведь это может привести и к модификации поля kamp... И даже к появлению нескольких записей с одним номером и с "дырками" в нумерации (если не предусмотрены соответсвующие констрейнты). Возможен случай, когда какой-нибудь мерзопакостный вредитель сельского хозяйства возьмет, да удалит запись из середины этой красивой логической последовательности. Что тогда должно произойти?
Вобщем-то, вопросы скорее риторические. Я понимаю, что приложение, юзающее эту таблицу, скорее всего, подобных действий никогда не произведет. Но иногда подумать о нестандартных ситуациях заранее бывает полезно...
...
Рейтинг: 0 / 0
Нужен триггер для вычислений между строками
    #32029007
Klimov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>Glory
Прошу простить мне, человеку, привыкшему к физической нумерации записей (строк), мой пассаж "лишь логически расположенных рядом двух строк". Конечно нужные мне строки раскиданы по таблице хаотично, но достаточно спокойно собираются хоть куда и хоть зачем. Да, Вы совершенно правы, что нужна разность между датами отключений и подключений электролизёров с соседними kamp, просто я хотел в перспективе отказаться от этого столбца (тут у меня ещё нет определённого решения).
>>Garya
"в одной команде Update может присутствовать модификация одновременно нескольких полей одновременно нескольких соседних записей"?!?! Опс-с-с-с воскликнул "прямоходящий". Это ещё как??? Если я ешё не слишком надоел, ткните носом где почитать, либо пример, а?
Поле kamp долно быть уникально в пределах ele и д.б. NOT NULL, посему на предложение Glory можно вполне опираться.
Удалить строку из середины этой стройной последовательности может не какая-нибудь злонамереннная саранча, а вполе благообразная божья коровка - это реальность, данная нам свыше. В таком случае немедленно должна перенумероваться kamp и пересчитаться srok_mi (это одна из задач мной сочиняемого триггера).

Должен сказать: "Один ... неграмотный человек... способен задать столько вопросов, что сотня мудрецов останутся в тупике", а посему спасибо за участие и науку. Пошёл препарировать как Базаров лягушку select от Glory, потом думать над констрайнтами для достоверности данных.

Update нескольких полей в нескольких записях???
...
Рейтинг: 0 / 0
Нужен триггер для вычислений между строками
    #32029040
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удалить строку из середины этой стройной последовательности может не какая-нибудь злонамереннная саранча, а вполе благообразная божья коровка - это реальность, данная нам свыше. В таком случае немедленно должна перенумероваться kamp и пересчитаться srok_mi

При возникновении "дырок" в нумерации достаточно слегка изменить запрос и не будет нужды изменять поле kamp. Главное, чтобы сохранялась последовательность значений в kamp

\ncreate table #t (kamp int, d_otkl datetime, d_podkl datetime, srok_mi int, ele int)
insert #t values(1, NULL, '19840203 15:03', NULL, 1)
insert #t values(2, '19880502 03:00', '19880517 06:32', 1234567, 1)
--insert #t values(3, '19890903 07:59', '19890918 23:00', 7654321, 1)
insert #t values(4, '19930412 15:26', '19930426 08:56', 9876543, 1)
insert #t values(5, '20020421 22:12', NULL, 1234567, 1)

select *, cast(a.d_otkl as real) - (select top 1 cast(b.d_podkl as real) from #t b where b.kamp <= a.kamp order by b.kamp )
from #t a

drop table #t
...
Рейтинг: 0 / 0
Нужен триггер для вычислений между строками
    #32029612
Klimov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наконец меня допустили опять до SQL.
Спасибо Glory за науку по Select & cast, НО!:
1. А что возвращает cast? Методом проб и ошибок выяснил, что разницу в датах м. заданной и началом 20 века.
В BOL написано, результат будет округлён до минуты.

Проверяю:
select datediff(mi,'19000101','20020506') as datedifff,
cast('20020506' as float) as castt,
datediff(mi,'19000101','20020506')/cast('20020506' as real) as mnogitel
Получаю:
datedifff castt mnogitel
----------- ----------------------------------------------------- ------------------------
53827200 20020506.0 2.6886034

???????

2. Посоветуйте прямоходящему рассылки, книги (бумажные, электронные) для начинающего с нуля. Мне надо ПОДРОБНЕЙШЕЕ описание языка TSql, советы по отладке (кроме QA) хранимых процедур и триггеров. Для начала, чтоб развивалась фантазия.

P.S. Боюсь завалить этот форум детскими вопросами
Спасибо.
...
Рейтинг: 0 / 0
Нужен триггер для вычислений между строками
    #32029639
Klimov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Б-р-р-р
Кажется дошло, не без помощи светлых голов.
Спасибо
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужен триггер для вычислений между строками
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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