Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Обновление таблицы на основе данных другой таблицы  [new]
yomkorouge
Member

Откуда:
Сообщений: 8
Добрый день.Помогите, пожалуйста реализовать следующие: есть 2 таблицы("Отпущено и "Продукция"), соединенные по первичному ключу. В обоих есть атрибут "Количество". Нужно сделать так, чтобы после заполнения поля "Количество" в таблице "Отпущено", это значение отнималось от "Количества" таблицы "Продукция". Проще говоря, товар продали и на складе количество должно уменьшится.
БД создана в SQL Server 2008 SP2.
24 май 11, 16:50    [10701462]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы на основе данных другой таблицы  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
update x set
 x.Количество =  x.Количество - y.Отпущенно
from Продукция x
  inner join Отпущенно y on x.ключ = y.ключ
24 май 11, 17:04    [10701578]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы на основе данных другой таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Maxx
update x set
 x.Количество =  x.Количество - y.Отпущенно
from Продукция x
  inner join Отпущенно y on x.ключ = y.ключ
Связь-то, небось, "один-ко-многим"!
Неправильный запрос, однако!
24 май 11, 17:09    [10701600]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы на основе данных другой таблицы  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap,

тсю.. так переписывается за 1 мин, не вапроз


Так же следует учитывать,что Отгрузить товара нельзя больше ,чем есть в наличие..так же ,далее пойдет в тему "условия списания" товара.. т.е. еле фифо или лифо или партионыый учет . Вообще нкто не держит данные о количестве товара в самом справочнике товара,ето если савсем по уму...

ведь пример был написан чисто как попросили ведь ,да про то, что списание будет не одно- я профтыкаль ,не спорю
24 май 11, 17:18    [10701661]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы на основе данных другой таблицы  [new]
yomkorouge
Member

Откуда:
Сообщений: 8
Maxx,
Это курсовик у меня такой, так что пока вникаю в тонкости все =). А количество товара проверяется простеньким триггером при вставке.
Можете, пожалуйста, написать как будет выглядеть этот же запрос со связью "один-ко-многим"? А то это единственное, что осталось реализовать, чтоб было все более-менее.
24 май 11, 17:29    [10701744]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы на основе данных другой таблицы  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
yomkorouge,

на пальцах дето так


update x set
 x.Количество =  x.Количество - ISNULL(y.Отпущенно, 0)
from Продукция x
  left outer  join( select ключ ,[Отпущенно] =  SUM(Отпущенно) Отпущенно group by ключ )y on x.ключ = y.ключ
24 май 11, 17:32    [10701768]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы на основе данных другой таблицы  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
update x set
 x.Количество =  x.Количество - ISNULL(y.Отпущенно, 0)
from Продукция x
  left outer  join( select ключ ,[Отпущенно] =  SUM(Отпущенно) from  Отпущенно group by ключ )y on x.ключ = y.ключ
24 май 11, 17:33    [10701774]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы на основе данных другой таблицы  [new]
yomkorouge
Member

Откуда:
Сообщений: 8
Maxx,

Хм, ругается на SUM(Отпущено) - "Недопустимое имя столбца"
24 май 11, 17:44    [10701860]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы на основе данных другой таблицы  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
yomkorouge
Maxx,

Хм, ругается на SUM(Отпущено) - "Недопустимое имя столбца"


ну сие уже перебор ,честно...Отпущено.Количество впишите туда вместо
SUM(Отпущено) -> SUM(Количество)
24 май 11, 17:47    [10701874]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы на основе данных другой таблицы  [new]
yomkorouge
Member

Откуда:
Сообщений: 8
Maxx,
В том-то и дело, что вписывал количество уже. Та же самая ошибка.
24 май 11, 17:53    [10701930]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы на основе данных другой таблицы  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
покажите весь запрос ,ошибку и скрипт создание 2х таблиц ваших.... тогда будет разговор...
24 май 11, 17:57    [10701951]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы на основе данных другой таблицы  [new]
yomkorouge
Member

Откуда:
Сообщений: 8
Maxx,

Таблицы делал не через запросы. Как глянуть скрипт создания?
Запрос выглядит так:
update x set
 x.Количество =  x.Количество - ISNULL(y.Количество, 0)
from Продукция x
  left outer  join( select [Номенклатурный номер] ,[Количество] =  SUM(Количество) from  Отпущено group by [Номенклатурный номер] )y on x.[Номенклатурный номер] = y.[Номенклатурный номер]

Текст ошибки:
Сообщение 207, уровень 16, состояние 1, строка 4
Недопустимое имя столбца "Количество".
24 май 11, 18:14    [10702090]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы на основе данных другой таблицы  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
[Количество] = SUM([Количество])
24 май 11, 18:17    [10702114]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы на основе данных другой таблицы  [new]
yomkorouge
Member

Откуда:
Сообщений: 8
Maxx,

Та же самая ошибка.
Вот скрипт создания таблиц:
Отпущено:
/****** Object:  Table [dbo].[Отпущено]    Script Date: 05/24/2011 18:18:29 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Отпущено](
	[Номенклатурный номер] [int] NOT NULL,
	[Номер товарной накладной] [int] NOT NULL,
	[Количество] [int] NULL,
 CONSTRAINT [PK_Отпущено_1] PRIMARY KEY CLUSTERED 
(
	[Номенклатурный номер] ASC,
	[Номер товарной накладной] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Отпущено]  WITH CHECK ADD  CONSTRAINT [FK_Отпущено_Продукция] FOREIGN KEY([Номенклатурный номер])
REFERENCES [dbo].[Продукция] ([Номенклатурный номер])
ON UPDATE CASCADE
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[Отпущено] CHECK CONSTRAINT [FK_Отпущено_Продукция]
GO

ALTER TABLE [dbo].[Отпущено]  WITH CHECK ADD  CONSTRAINT [FK_Отпущено_Товарная накладная] FOREIGN KEY([Номер товарной накладной])
REFERENCES [dbo].[Товарная накладная] ([Номер товарной накладной])
ON UPDATE CASCADE
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[Отпущено] CHECK CONSTRAINT [FK_Отпущено_Товарная накладная]
GO

Продукция:
/****** Object:  Table [dbo].[Продукция]    Script Date: 05/24/2011 18:18:50 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Продукция](
	[Номенклатурный номер] [int] NOT NULL,
	[Наименование] [nvarchar](50) NOT NULL,
	[Код категории] [int] NOT NULL,
	[Цена] [int] NOT NULL,
	[Количество] [nchar](10) NOT NULL,
	[Единица измерения] [nchar](10) NOT NULL,
	[Вид категории] [nvarchar](50) NOT NULL,
	[Срок годности] [date] NOT NULL,
 CONSTRAINT [PK_Продукция] PRIMARY KEY CLUSTERED 
(
	[Номенклатурный номер] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Продукция]  WITH CHECK ADD  CONSTRAINT [FK_Продукция_Категория] FOREIGN KEY([Код категории])
REFERENCES [dbo].[Категория] ([Код категории])
GO

ALTER TABLE [dbo].[Продукция] CHECK CONSTRAINT [FK_Продукция_Категория]
GO

24 май 11, 18:22    [10702151]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы на основе данных другой таблицы  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а ето как понимать то ??
CREATE TABLE [dbo].[Продукция](
	[Номенклатурный номер] [int] NOT NULL,
[b]	[Цена] [int] NOT NULL,
	[Количество] [nchar](10) NOT NULL[/b],

update x set
 x.[Количество] =  CAST((CAST(x.[Количество] as int) - ISNULL(y.[Количество], 0) ) as nchar(10))
from dbo.[Продукция] x
  left outer  join( select [Номенклатурный номер] ,[Количество] =  SUM([Количество]) from  dbo.[Отпущено] group by [Номенклатурный номер] )y on x.[Номенклатурный номер] = y.[Номенклатурный номер]
24 май 11, 18:28    [10702199]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы на основе данных другой таблицы  [new]
yomkorouge
Member

Откуда:
Сообщений: 8
Maxx,

Мда, косяк.
Исправил тип данных - все заработало. Огромное спасибо!
24 май 11, 19:03    [10702402]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить