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

Откуда:
Сообщений: 2
Есть таблица t_Inv
В ней есть поле StateCode
StateCode может принимать значения:
1100110, 1100111, 1100112, 1100113, 1100114
Причем есть правило, запрещающее переход с одного значения на другое, кроме описанного ниже порядка:
1100110 → 1100111 → 1100112 → 1100113 → 1100114
В таблице t_Inv есть ряд записей {DocID in ()}, в котором поле StateCode имеет самые разные значения, причем нам неизвестно какие записи с какими конкретно кодами, просто знаем, что они IN (1100110,1100111,1100112,1100113).
Необходимо написать запрос, который приведет все записи поля StateCode в значение 1100114, с учетом правила перехода.
---
У меня совсем не выходит (
8 май 14, 11:04    [15989707]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
nordgaimer
.... написать запрос, который приведет все записи поля StateCode в значение 1100114, с учетом правила перехода.
(

что это означает ???
8 май 14, 11:20    [15989828]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8300
Отмените временно правило и обновите до финального значения. Затем включите правило.
8 май 14, 11:20    [15989834]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу  [new]
nordgaimer
Member

Откуда:
Сообщений: 2
LexusR
nordgaimer
.... написать запрос, который приведет все записи поля StateCode в значение 1100114, с учетом правила перехода.
(

что это означает ???

Вот и я не могу понять.
8 май 14, 11:22    [15989851]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу  [new]
Crimean
Member

Откуда:
Сообщений: 13148
а почему не поставить всем сразу "1100114"? система "не даст"?
тогда вам нужно будет делать не один запрос )
"классика" - делаем справочник переходов и работаем по нему, пока есть куда переходить, как-то так:

-- ваша табличка
declare @x table ( id int identity primary key , StateCode int , UpdateCount int DEFAULT(0) )
insert into @x ( StateCode ) values
(1100110),
(1100111),
(1100112),
(1100113),
(1100114)

-- справочник переходов - тут PRIMARY KEY очень "неспроста"
declare @a table ( StateFrom int PRIMARY KEY , StateInto int )
insert into @a ( StateFrom , StateInto ) values
( 1100110 , 1100111 ),
( 1100111 , 1100112 ),
( 1100112 , 1100113 ),
( 1100113 , 1100114 )

while 1=1 begin

update x
set x.StateCode = a.StateInto , x.UpdateCount += 1
from @x as x
join @a as a on a.StateFrom = x.StateCode

if @@rowcount = 0 break

end

select * from @x
8 май 14, 11:22    [15989863]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
nordgaimer
Необходимо написать запрос, который приведет все записи поля StateCode в значение 1100114, с учетом правила перехода.

create table #t_Inv (
   id int identity primary key
   , DocId varchar(100)
   , StateCode char(7) constraint CHK_tInv_StateCode check (StateCode in ('1100110', '1100111', '1100112', '1100113', '1100114'))
   , StateCheck char(7)
   );
insert #t_Inv (DocId, StateCode, StateCheck) values
   (1,'1100112','1100112'), 
   (1,'1100110','1100110'), 
   (1,'1100113','1100113'), 
   (2,'1100110','1100110'), 
   (3,'1100110','1100110'), 
   (3,'1100112','1100112'), 
   (3,'1100110','1100110'), 
   (3,'1100114','1100114'), 
   (3,'1100111','1100111'), 
   (3,'1100113','1100113'), 
   (3,'1100112','1100112'), 
   (4,'1100112','1100112'), 
   (5,'1100110','1100110');

create table #rules (id int identity(0,1) primary key, State_from char(7) unique, State_to char(7));
insert #rules (State_from, State_to) values ('1100113', '1100114'),('1100112', '1100113'),('1100111', '1100112'),('1100110', '1100111'),('1100114', '1100110');

update g set g.StateCode=r.State_to
from (
   select * , row_number()over(partition by i.DocId  order by i.id desc)-1 npp
   from #t_Inv i
   where i.DocId in (1,2,3)
   )g
join #rules r on r.id=(g.npp%5)

select * from #t_Inv  i
order by i.DocId, i.id;

idDocIdStateCodeStateCheck
1111001121100112
2111001131100110
3111001141100113
4211001141100110
5311001131100110
6311001141100112
7311001101100110
8311001111100114
9311001121100111
10311001131100113
11311001141100112
12411001121100112
13511001101100110
8 май 14, 11:57    [15990171]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить