Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужен триггер для вычислений между строками / 11 сообщений из 11, страница 1 из 1
26.04.2002, 05:49
    #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
26.04.2002, 06:09
    #32028888
Faza
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен триггер для вычислений между строками
А в чем проблема поставить это на триггер. Ты и сам подал идею.
Единственное но - должна быть точка выхода из триггера. Или условие, по которому он буде срабатывать, например при изменении только вышеназванных полей.
...
Рейтинг: 0 / 0
26.04.2002, 06:48
    #32028894
Klimov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен триггер для вычислений между строками
>> Faza
Сложности пока представляю приблизительно. В QA пока всё работает за исключением перехода через 2000 год - отрицат. datediff() получается, но на это есть BOL... Читаю вот.

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

Спасибо за внимание к DOSовскому Foxисту. С уважением Андрей.
...
Рейтинг: 0 / 0
26.04.2002, 07:39
    #32028899
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен триггер для вычислений между строками
...
Рейтинг: 0 / 0
26.04.2002, 09:57
    #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
26.04.2002, 10:35
    #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
26.04.2002, 16:05
    #32028982
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен триггер для вычислений между строками
Как вариант, можно использовать не простые триггеры, а Instead-триггеры. Они гарантированно не приводят к рекурсии (а ведь для других таблиц рекурсивные триггеры вполне могут поднадобиться, что требует в простых триггерах дополнительных средств защиты от нежелательной рекурсии).
Glory высветил весьма забавный нюанс. Если взглянуть на задачу "так сказать, вообще", то в одной команде Update может присутствовать модификация одновременно нескольких полей одновременно нескольких соседних записей. Не то, чтобы это какая-то серьезная проблема, даже совсем не проблема. Просто нужно сразу продумать такой вариант развития событий и однозначно определиться, во всех ли случаях корректно работает алгоритм. В частности, ведь это может привести и к модификации поля kamp... И даже к появлению нескольких записей с одним номером и с "дырками" в нумерации (если не предусмотрены соответсвующие констрейнты). Возможен случай, когда какой-нибудь мерзопакостный вредитель сельского хозяйства возьмет, да удалит запись из середины этой красивой логической последовательности. Что тогда должно произойти?
Вобщем-то, вопросы скорее риторические. Я понимаю, что приложение, юзающее эту таблицу, скорее всего, подобных действий никогда не произведет. Но иногда подумать о нестандартных ситуациях заранее бывает полезно...
...
Рейтинг: 0 / 0
27.04.2002, 03:12
    #32029007
Klimov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен триггер для вычислений между строками
>>Glory
Прошу простить мне, человеку, привыкшему к физической нумерации записей (строк), мой пассаж "лишь логически расположенных рядом двух строк". Конечно нужные мне строки раскиданы по таблице хаотично, но достаточно спокойно собираются хоть куда и хоть зачем. Да, Вы совершенно правы, что нужна разность между датами отключений и подключений электролизёров с соседними kamp, просто я хотел в перспективе отказаться от этого столбца (тут у меня ещё нет определённого решения).
>>Garya
"в одной команде Update может присутствовать модификация одновременно нескольких полей одновременно нескольких соседних записей"?!?! Опс-с-с-с воскликнул "прямоходящий". Это ещё как??? Если я ешё не слишком надоел, ткните носом где почитать, либо пример, а?
Поле kamp долно быть уникально в пределах ele и д.б. NOT NULL, посему на предложение Glory можно вполне опираться.
Удалить строку из середины этой стройной последовательности может не какая-нибудь злонамереннная саранча, а вполе благообразная божья коровка - это реальность, данная нам свыше. В таком случае немедленно должна перенумероваться kamp и пересчитаться srok_mi (это одна из задач мной сочиняемого триггера).

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

Update нескольких полей в нескольких записях???
...
Рейтинг: 0 / 0
27.04.2002, 10:15
    #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
07.05.2002, 06:38
    #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
07.05.2002, 10:43
    #32029639
Klimov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен триггер для вычислений между строками
Б-р-р-р
Кажется дошло, не без помощи светлых голов.
Спасибо
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужен триггер для вычислений между строками / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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