Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 14.07.2015
Сообщений: 19

Написать триггер для учета количества книг

19.02.2016, 14:16. Показов 6276. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, прошу помощи с задачкой
Есть таблица с базой книг, с полями: Название и количество на складе,
и есть вторая таблица Продаж, задача состоит в том, что когда мы заполняем таблицу продаж, вводим ID книги, то с первой таблицы(склад) в поле - кол-во должно вычесть единицу, .т.е на складе было 3 книги Анна Каренина, мы одну купили, стало 2...и если на складе нету подходящей книги, то данные в таблицу Sale не заносятся

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
create table Books(
ID int IDENTITY(0,1) PRIMARY KEY,
Name nvarchar(100) NOT NULL,
nCount int NOT NULL,
 
CONSTRAINT check_nCount CHECK (nCount >= 0))
 
 
INSERT into Books(Name, nCount) values
('Отцы и дети', 3),
('Война и мир', 2),
('Анна Каренина', 4)
 
create table Sale(
ID int IDENTITY(0,1) PRIMARY KEY,
idBook int NOT NULL,
 
CONSTRAINT FK_idBook FOREIGN KEY (idBook) REFERENCES Books (ID))
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.02.2016, 14:16
Ответы с готовыми решениями:

Триггер для добавления к строке название таблицы, в которой содержится триггер
Есть таблицы База_Практик. В неё добавляю предприятие, и автоматически нужно добавить это предприятие с именем таблицы База практик в...

Триггер для добавления к строке название таблицы, в которой содержится триггер
Есть таблицы База_Практик. В неё добавляю предприятие, и автоматически нужно добавить это предприятие с именем таблицы База практик в...

Написать триггер для автоматического обновления поля при обновлении, удалении, добавлении записей в таблице
Добавить в таблицу «Продавцы» поле «Суммарный вес продаж» и написать триггер для автоматического обновления этого поля при обновлении,...

27
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
19.02.2016, 14:26
Цитата Сообщение от kurtx Посмотреть сообщение
в поле - кол-во должно вычесть единицу
Я не рекомендую тебе вести живые остатки в базе.
Остатки - это вычисляемая величина по периодам и списку приходно расходных ордеров. Их не рекомендуется хранить в базе. Рекомендуется запросом подбивать агрегатными функциями остаток товара проходя по списку накладных.
1
0 / 0 / 0
Регистрация: 14.07.2015
Сообщений: 19
19.02.2016, 14:29  [ТС]
Hikari, я только начинаю изучать t-sql, нужно выполнить описанную выше задачку, если есть другой способ это сделать, покажите пожалуйста наглядно
за совет спасибо
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
19.02.2016, 16:12
Если это ради изучения, то не очень удачный пример... Я не подскажу тебе как бы делала это триггерами, я скажу как бы делала хитрая блондиночка:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE PROCEDURE Купить
@Книга NCHAR(100),
 
AS
 
BEGIN
DECLARE  @КолвоКниг INT 
DECLARE  @IDКнига INT 
@IDКнига =(SELECT ID FROM Books WHERE Name=@Книга)
IF NOT @IDКнига IS NULL BEGIN
 @КолвоКниг=(SELECT nCount FROM Books WHERE id=@IDКнига )
 IF @КолвоКниг>1 BEGIN
  UPDATE Books SET nCount=nCount-1 WHERE id=@IDКнига
  INSERT INTO Sale (@IDКнига)
 END
END
 
END
GO
И применение:
SQL
1
EXECUTE [Купить]("Охота за Красным Октябрем");
Смысл: Все проверки упаковать в процедуру. Добавить по вкусу обработку исключений и ошибок.
Забыть про триггеры.
1
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
19.02.2016, 16:56
ужос
никому больше не показывайте такие подходы и к оперативному учету, и написанию на SQL
0
5 / 5 / 4
Регистрация: 24.03.2010
Сообщений: 241
Записей в блоге: 1
22.02.2016, 21:37
Цитата Сообщение от Hikari Посмотреть сообщение
Я не рекомендую тебе вести живые остатки в базе.
Остатки - это вычисляемая величина по периодам и списку приходно расходных ордеров. Их не рекомендуется хранить в базе
Не совсем понял, что имеете ввиду?

То есть запасы не должны храниться в таблицах и определение остатка на складе должно выполняться методом подсчета?
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
22.02.2016, 22:07
Цитата Сообщение от RCF Посмотреть сообщение
То есть запасы не должны храниться в таблицах и определение остатка на складе должно выполняться методом подсчета?
Совершенно верно. Иначе однажды ты не сведешь баланс, если хранимые остатки у тебя будут расходиться с набором ордеров. Если это курсовая - еще ладно, но если реальная программа, то, думаю тебе не стоит будить спящего налогового инспектора.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
22.02.2016, 22:42
Hikari, набросайте схематично - как при вашем подходе контролировать целостность данных, т.е. чтобы расход не превышал приход.
0
5 / 5 / 4
Регистрация: 24.03.2010
Сообщений: 241
Записей в блоге: 1
23.02.2016, 01:06
Цитата Сообщение от Hikari Посмотреть сообщение
Совершенно верно
Вы глубоко заблуждаетесь по тому поводу, чтобы остатки не должны храниться на складе ))

И причем тут не сведешь ? И причем тут набор ордеров и факт хранения (в таблицах) запаса на складе?
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
23.02.2016, 09:18
Цитата Сообщение от invm Посмотреть сообщение
как при вашем подходе контролировать целостность данных, т.е. чтобы расход не превышал приход.
Что значит "как"?
Как получить список приходных ордеров по коду ордера?
Как вообще кладовщики работают в бумажных каталогах товара, знаешь? Как они подбивают свои остатки?
Цитата Сообщение от RCF Посмотреть сообщение
Вы глубоко заблуждаетесь по тому поводу, чтобы остатки не должны храниться на складе ))
Ну тогда я умолкаю.
Цитата Сообщение от RCF Посмотреть сообщение
И причем тут не сведешь ?
У тебя допустим произойдет ситуация, когда остаток не запишется в поле таблички, но движение товара зафиксируется в виде накладной. Ты потом какой циферке доверять будешь? Той, которая будет в виде остатка, или той, которая пройдет по учету инвентаризации?

Ладно, я уже поняла. Мне в этой теме не рады, более мешать не буду. Делайте как умеете - я свое мнение из личного опыта работы со складом выразила.
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
23.02.2016, 09:29
Цитата Сообщение от RCF Посмотреть сообщение
Вы глубоко заблуждаетесь по тому поводу, чтобы остатки не должны храниться на складе ))
хранить остатки без движений - бред.Покурите оперативный учет
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
23.02.2016, 11:30
Цитата Сообщение от Hikari Посмотреть сообщение
Что значит "как"?
Как получить список приходных ордеров по коду ордера?
Как вообще кладовщики работают в бумажных каталогах товара, знаешь? Как они подбивают свои остатки?
Понятно. Перед каждым списанием "подбиваем остатки".
Попробуйте хоть немного подумать над тем, как ваш подход будет работать при большом количестве движений и в многопользовательском окружении.
Цитата Сообщение от Hikari Посмотреть сообщение
У тебя допустим произойдет ситуация, когда остаток не запишется в поле таблички, но движение товара зафиксируется в виде накладной.
ACID? Транзакции? Не, не слышала.
Цитата Сообщение от Hikari Посмотреть сообщение
Ну тогда я умолкаю.
Правильно. Не стоит позориться и лезть с советами в область, в которой не разбираетесь.
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
23.02.2016, 12:46
Цитата Сообщение от invm Посмотреть сообщение
Перед каждым списанием "подбиваем остатки".
Зачем? Причем тут списание? Движение товаров формируется на основе ордеров за период. Если за определенный период был по накладным отгружен товар, то самым простейшим запросом с агрегатными функциями легко получим остатки. Причем тут списание?
Цитата Сообщение от invm Посмотреть сообщение
Попробуйте хоть немного подумать над тем, как ваш подход будет работать при большом количестве движений и в многопользовательском окружении.
А чего тут думать? Я уже так 5 лет работаю, и от пользователей только спасибо слышу.
Зато около 6 лет мучаюсь с программой, которая остатки хранит в таблице. Вечно получается так, что между периодами происходит недостача, ибо кто-то вручную остатки корректирует, и они потом с движением не коррелируются. В результате бухгалтерия пъет корвалолчик и хватается за сердечко.
А потом я сижу и полнедели эти остатки правлю. Бр-р-р...
Цитата Сообщение от invm Посмотреть сообщение
ACID? Транзакции? Не, не слышала.
А причем тут транзакции? У тебя данные дублируются. Транзакции тут не помошники.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
23.02.2016, 13:42
Цитата Сообщение от Hikari Посмотреть сообщение
Зачем? Причем тут списание?
Что, действительно не понимаете?
Допустим, вы наагрегировали по движениям остаток некоего артикула в 10 единиц. Теперь проводят расходную накладную с этим же артикулом на 11 единиц. Контролировать такую ситуацию не нужно?
Цитата Сообщение от Hikari Посмотреть сообщение
Зато около 6 лет мучаюсь с программой, которая остатки хранит в таблице. Вечно получается так, что между периодами происходит недостача, ибо кто-то вручную остатки корректирует, и они потом с движением не коррелируются.
Это всего лишь говорит о том, что у вас бардак с учетом. Потому что при нормальной работе никто остатки вручную не корректирует.
Цитата Сообщение от Hikari Посмотреть сообщение
А причем тут транзакции?
Что, опять не понимаете?
Транзакции нужны, что бы не получить "остаток не запишется в поле таблички, но движение товара зафиксируется в виде накладной".
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
23.02.2016, 14:10
Цитата Сообщение от invm Посмотреть сообщение
Теперь проводят расходную накладную с этим же артикулом на 11 единиц.
И? Программа должна получить остаток на складе по списку проведенных накладных и вынести вердикт о том, есть ли товар или уже весь ушел в движение.
Цитата Сообщение от invm Посмотреть сообщение
Потому что при нормальной работе никто остатки вручную не корректирует.
А я разве говорю что у меня все хорошо? Именно из-за хранения остатков из-за непродуманной структуры хранилища остатки и приходится корректировать. Программист, который мне такую ПО поставил не учитывал вообще ничего, в результате часть накладных (особенно при фиксировании боя и возврата) просто не фиксирует ордера. Да и со списание беда. А товароведам все равно. Им главное свести баланс, а для этого нужно в конце периода остатки согласовать с бухгалтерией, вот и лезут ручками прямо в таблицу.
Цитата Сообщение от invm Посмотреть сообщение
Транзакции нужны, что бы не получить "остаток не запишется в поле таблички, но движение товара зафиксируется в виде накладной".
А причем тут это? Если у тебя никогда не было ситуаций, когда ПО, коим ты пользуешься, работает на ура, то это не значит что у всех остальных все так же. Просто признайся - ты не сталкивался с ситуациями, когда и срочно, и точно и немедля, иначе накажут
И как можно надеяться на транзакцию, если она изначально оказывается несогласованной с другими движениями данных?
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
23.02.2016, 16:00
Цитата Сообщение от Hikari Посмотреть сообщение
И как можно надеяться на транзакцию, если она изначально оказывается несогласованной с другими движениями данных?
Это в анналы. Зачем вообще нужны транзакции?

Добавлено через 2 минуты
Цитата Сообщение от pincet Посмотреть сообщение
Зачем тогда вообще нужны транзакции?
И зачем конечному пользователю знать про "Что? Что у вас? - У нас транзакция. - @я, мне .... что это. Прямо здесь и прямо сейчас!"
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
23.02.2016, 16:09
Мне кажется, для данной задачи стоит рассмотреть реализацию в виде индексированного представления.
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
23.02.2016, 16:14
Цитата Сообщение от pincet Посмотреть сообщение
И зачем конечному пользователю знать
Во-первых не нужно так бурно проявляться. Ты все таки не Свема.
Во-вторых пользователю особенно кладовщику это не интересно. Кладовщику бы баланс свести. Да так, чтоб сошлось с бухгалтерией до копеечки. Его не интересуют ни транзакции ни то, как хранятся остатки, ни то, какой методикой они высчитываются. Если у кого-то схема с хранением остатков отдельной цифирью независимо от списка ордеров работает на ура - я очень рада.
На сим откланиваюсь, свое мнение я выразила. Принимать его или плеваться от избытка самомнения - это уже меня не интересует.
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
23.02.2016, 16:24
Цитата Сообщение от Hikari Посмотреть сообщение
Если у кого-то схема с хранением остатков отдельной цифирью независимо от списка ордеров работает на ура - я очень рада.
а это что?
UPDATE Books SET nCount=nCount-1 WHERE id=@IDКнига
INSERT INTO Sale (@IDКнига)
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
23.02.2016, 16:27
Цитата Сообщение от Hikari Посмотреть сообщение
И? Программа должна получить остаток на складе по списку проведенных накладных и вынести вердикт о том, есть ли товар или уже весь ушел в движение.
Ага, ожидаемый ответ. С учетом работы БД в многопользовательском окружении:
1. Как вы обеспечите достоверность полученных значений?
2. Как предотвратить получение одного и того же значения остатка параллельными сеансами, с последующей некорректной проверкой допустимости списаний?
Цитата Сообщение от Hikari Посмотреть сообщение
А я разве говорю что у меня все хорошо? Именно из-за хранения остатков из-за непродуманной структуры хранилища остатки и приходится корректировать. Программист, который мне такую ПО поставил не учитывал вообще ничего, в результате часть накладных (особенно при фиксировании боя и возврата) просто не фиксирует ордера. Да и со списание беда. А товароведам все равно. Им главное свести баланс, а для этого нужно в конце периода остатки согласовать с бухгалтерией, вот и лезут ручками прямо в таблицу.
И что? Как это влияет на безапеляционность вашего предложения не хранить остатки?
Цитата Сообщение от Hikari Посмотреть сообщение
А причем тут это? Если у тебя никогда не было ситуаций, когда ПО, коим ты пользуешься, работает на ура, то это не значит что у всех остальных все так же. Просто признайся - ты не сталкивался с ситуациями, когда и срочно, и точно и немедля, иначе накажут
Ну да, сначала сделаем кривой дизайн БД, да еще и разрешим всем подряд лазить в таблицы руками и править что угодно и как угодно. А потом будем героически бороться с последствиями, внедряя не менее кривые костыли и выдавая это за собственные достижения, которыми можно гордиться и рекомендовать как единственно правильный способ решения задачи.
И если вы привыкли так работать, это не означает, что все остальные должны работать аналогично.
Цитата Сообщение от Hikari Посмотреть сообщение
И как можно надеяться на транзакцию, если она изначально оказывается несогласованной с другими движениями данных?
Транзакции не бывают согласованными с данными.
Если ваша БД открыта для прямых модификаций без всякого контроля, - не помогут ни транзакции, ни что-либо еще.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.02.2016, 16:27
Помогаю со студенческими работами здесь

Написать программу учета книг в библиотеке (используя коллекции)
Написать программу учета книг в библиотеке. Сведения о книгах содержат: фамилию и инициалы автора, название, год издания, количество...

Программа для учета книг в библиотеке
Суть программы заключается в создании базы данных через структуры или классы с возможностью добавления редактирования удаления записей...

Программа учета книг
Написать программу, выполняющую следующие действия со структурой и файлами: Программа учета книг, считывать информацию из файла,...

Программа учета книг
Добрый день. Нужна программа, в которой можно вести учет прочитанных книг, книг в планах и книг в процессе. Чтобы по определенному...

Задача с очередью. Составить программу для ведения очереди и учета количества компьютеров в филиалах
Имеется следующая задача: Поставщик направляет товар Заказчику. Заказчик имеет сеть филиалов. Поступающий товар распределяется по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru