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

Откуда: СПб
Сообщений: 270
Всем привет!

Имеются таблицы, хранящие связи ревизий с их наполнением

Revisions
ID_REVISIONNUM_REVISIONVERSIONREF_VOLUMEDone
4NullNull121true
5NullNull123false
61457-141121false


Link_SectionToRevision
ID_LKSECTIONREF_REVISIONREF_SECTION
343
444
555
656
763
864


Link_DetailToSection
ID_LKDETAIL REF_DETAIL REF_SYSTEM REF_LKSECTION Deleted
2 12 875 3 false
3 13 106 3 false
4 14 106 3 false
5 15 106 3false
6 16 106 3false
7 17 875 3false
8 18 875 3false
9 19 875 3false
10 20 875 3false
11 21 875 3false
12 22 875 3false
13 23 106 3false
14 24 875 3false
16 26 875 4false
17 27 875 4false
18 28 875 4false
19 29 875 4false
20 30 875 3false


Подскажите, есть ли приемы и вообще можно ли так сделать, чтобы при выборе ревизии выводились только те позиции, которые относятся к этой ревизии.

Поясню в таблице Revisions есть строка 4 с нулевой ревизией, с которой связаны все строки из таблице Link_DetailToSection через Link_SectionToRevision. Так же есть строка 6 это уже первая ревизия той строки 4.

В данном случае при выборе ревизии 0 и ревизии 1 мы должны получить один и тот же результат.

Теперь скажем нам в ревизии 1 нужно изменить данные связанные со строкой 11 в таблице Link_DetailToSection. В результате изменения у нас должна появится 1 строка в таблице Link_DetailToSection

ID_LKDETAIL REF_DETAIL REF_SYSTEM REF_LKSECTION Deleted
21218757false


и удалить строку 7, за не надобностью
ID_LKDETAIL REF_DETAIL REF_SYSTEM REF_LKSECTION Deleted
22178757true


Теперь при выборе ревизии 0 и 1 мы должны получить разные списки строк.

При выборе ревизии 0 он должен остаться прежним, а при ревизии 1 должна добавиться строка 21 вместо 11 и уйти строка 7

Возможно ли такое или сделать простым созданием дублирования строк при создании новой ревизии?
10 окт 14, 11:16    [16686157]     Ответить | Цитировать Сообщить модератору
 Re: Отбор позиций в зависимости от выбранной ревизии  [new]
TempFox
Guest
Веткин Сергей
Подскажите, есть ли приемы и вообще можно ли так сделать, чтобы при выборе ревизии выводились только те позиции, которые относятся к этой ревизии.
Да вроде бы так и пишутся программы, связанные с базами данных, устанавливается связь между таблицами "Master - Detail", и когда курсор перемещается по главной таблице (Master), в подчинённой (Detail) отображаются только данные, относящиеся к текущей строке в Master...



Веткин Сергей
Возможно ли такое или сделать простым созданием дублирования строк при создании новой ревизии?
При создании новой ревизии может быть дать возможность пользователю создать пустую или клонировать с конкретной уже существующей, например, с текущей?
10 окт 14, 12:42    [16686802]     Ответить | Цитировать Сообщить модератору
 Re: Отбор позиций в зависимости от выбранной ревизии  [new]
vso
Member

Откуда: СПб
Сообщений: 270
TempFox
При создании новой ревизии может быть дать возможность пользователю создать пустую или клонировать с конкретной уже существующей, например, с текущей?


Это решение, которое я реализовываю. Здесь же задал вопрос можно ли создать запрос который бы выбирал все позиции из текущей ревизии, а все неизмененные/неудаленные выбирал бы из предыдущих ревизий.

Для исключения повторяющих ся записей в таблице Link_DetailToSection.
10 окт 14, 16:15    [16688125]     Ответить | Цитировать Сообщить модератору
 Re: Отбор позиций в зависимости от выбранной ревизии  [new]
TempFox
Guest
Как дела с запросом?
14 окт 14, 09:26    [16700243]     Ответить | Цитировать Сообщить модератору
 Re: Отбор позиций в зависимости от выбранной ревизии  [new]
vso
Member

Откуда: СПб
Сообщений: 270
TempFox,

Придумал, вроде работает, но остается вопрос на сколько я эффективное решение придумал.

сейчас на маленьких значениях - летает.

Но в боевых условиях, т.к. может быть в одной ревизии и 1000 и 2000 строк, не говоря уже об общем кол-ве строк в таблице, вопрос остается открытым

DECLARE @Ver int;
DECLARE @Revisions TABLE (
  ID_REVISION  int,
  NUM_REVISION nvarchar(20),
  VERSION      int,
  REF_VOLUME   int,
  Closed         bit
)

INSERT INTO @Revisions
  VALUES (4, NULL, NULL, 121, 1),
         (5, NULL, NULL, 123, 0),
         (6, N'1457-14', 1, 121, 1),
         (7, N'2547-14', 2, 121, 0)

DECLARE @Link_SectionToRevision TABLE (
  ID_LKSECTION int,
  REF_REVISION int,
  REF_SECTION  int
)

INSERT @Link_SectionToRevision
  VALUES (3, 4, 3),
         (4, 4, 4),
         (5, 5, 5),
         (6, 5, 6),
         (7, 6, 3),
         (8, 6, 4),
         (9, 7, 3),
         (10, 7, 4)

DECLARE @Link_DetailToSection TABLE (
  ID_LKDETAIL   int,
  REF_DETAIL    int,
  REF_SYSTEM    int,
  REF_LKSECTION int,
  Deleted       bit
)

INSERT @Link_DetailToSection
  VALUES (2, 12, 875, 3, 0),
         (3, 13, 106, 3, 0),
         (4, 14, 106, 3, 0),
         (5, 15, 106, 3, 0),
         (6, 16, 106, 3, 0),
         (7, 17, 875, 3, 0),
         (8, 18, 875, 3, 0),
         (9, 19, 875, 3, 0),
         (10, 20, 875, 3, 0),
         (11, 21, 875, 3, 0),
         (12, 22, 875, 3, 0),
         (13, 23, 106, 3, 0),
         (14, 24, 875, 3, 0),
         (16, 26, 875, 4, 0),
         (17, 27, 875, 4, 0),
         (18, 28, 875, 4, 0),
         (19, 29, 875, 4, 0),
         (20, 30, 875, 3, 0),
         (21, 21, 875, 7, 0),
         (22, 17, 875, 8, 1),
         (23, 15, 106, 7, 1),
         (24, 29, 875, 8, 0),
         (25, 13, 106, 9, 0),
         (26, 18, 875, 10, 0)

SET @Ver = 7;

WITH a AS
(
SELECT T2.*,
       ISNULL(t.VERSION, 0) AS 'VERSION'
FROM @Revisions t
  INNER JOIN @Link_SectionToRevision T1 ON t.ID_REVISION = T1.REF_REVISION
  INNER JOIN @Link_DetailToSection T2 ON T1.ID_LKSECTION = T2.REF_LKSECTION
WHERE t.REF_VOLUME = (SELECT REF_VOLUME FROM @Revisions WHERE ID_REVISION = @Ver)
  AND ISNULL(t.VERSION, 0) <= (SELECT ISNULL(VERSION, 0) FROM @Revisions WHERE ID_REVISION = @Ver)
),
b AS
(
SELECT T2.*
FROM a T2
WHERE T2.VERSION = (SELECT MAX(a.VERSION) FROM a WHERE REF_DETAIL = T2.REF_DETAIL)
)

SELECT * FROM b WHERE Deleted = 0
14 окт 14, 11:56    [16701053]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить