Создать экземпляр таблицы в одной строке? - PullRequest
2 голосов
/ 03 июня 2019

У меня возникают проблемы с выяснением того, как создать моментальный снимок (или экземпляр) таблицы, когда пользователь обновляет таблицу в пользовательском интерфейсе.

Проблема:

У меня есть интерфейс для «Поправок». В пользовательском интерфейсе есть раскрывающийся список «Тип поправки». Тип поправки также имеет собственный пользовательский интерфейс, и пользователь может проверить / отменить выбор списка доступных типов поправок здесь. Когда пользователь отменяет проверку типа поправки, этот тип удаляется из раскрывающегося списка для всех поправок. Клиент спрашивает, что изменения в Типе поправок влияют ТОЛЬКО на НОВЫЕ поправки, а не на те, которые существовали до изменения.

Таким образом, если значения Типа поправки для «Новый, Черновой, Закрытый» были проверены ранее, а «Черновик» не был проверен, мне все равно нужно будет отобразить все три значения в пользовательском интерфейсе для существующих поправок, а затем только отобразить «Новые» и «Закрытые» для новых поправок. Но затем они могут вернуться и снова открыть «Черновик» и снова отобразить его, но только для Поправок, созданных после того, как они вновь открыли его.

Для меня это означает, что мне нужно создать таблицу для «Истории типов поправок». В таблице «Тип поправки» есть столбец AmendmentTypeID, в котором все идентификаторы отображаются в виде строк. Я бы отобразил их в виде столбцов со строкой, определяемой датой вступления в силу - датой изменения значений. Затем я бы связал Amendment с AmendmentTypeHistoryID и отобразил значения, просмотрев AmendmentTypeID.

, например

dbo.AmendmentType

AmendmentTypeID          Name         CreationDate       IsActive
      1                  New            6/2/2019            1
      2                  Draft          6/2/2019            1
      3                  Closed         6/2/2019            1

dbo.AmendmentTypeHistory

AmendmentTypeHistoryID     EffectiveDate     AmendmentTypeID     AmendmentTypeID     AmendmentTypeID
            1             6/3/2019           1 (New)             2 (Draft)               3 (Closed)

Тогда вы меняете это ...

dbo.AmendmentType

AmendmentTypeID          Name         CreationDate       IsActive
      1                  New            6/2/2019            1
      3                  Closed         6/2/2019            1

dbo.AmendmentTypeHistory

AmendmentTypeHistoryID     EffectiveDate     AmendmentTypeID     AmendmentTypeID     AmendmentTypeID
            1             6/3/2019           1 (New)             2 (Draft)               3 (Closed)
            2             6/3/2019           1 (New)             3 (Closed)     NULL

Всего доступно 77 типов поправок. Это не то, что я могу написать жестко, поэтому я надеялся, что смогу сделать это как-то динамически.

Кто-нибудь знает, как я мог это сделать? Есть ли более простой или лучший способ сделать то, что я пытаюсь сделать?

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Это очень сложное и запутанное требование. Что произойдет, если Типы поправок IsActive различаются между моментом их загрузки в раскрывающийся список и моментом сохранения пользователем своей записи?

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

Создайте таблицу с именем AmendmentTypeGroup:

create table AmendmentTypeGroup
(
AmendmentTypeGroupID int identity
,AmendmentTypes nvarchar(max) not null
,constraint PK_AmendmentTypeGroup primary key clustered(AmendmentTypeGroupID)
)

Добавьте столбец в таблицу изменений (не тип изменений):

alter table Amendmends add AmendmentTypeGroupID int null

Каждый раз, когда вы вставляете строку в Amendments, используйте триггер или процедуру, чтобы убедиться, что вы сначала вставляете в AmendmentTypeGroup группу всех идентификаторов всех типов AmendmentType, которые на данный момент являются IsActive, получают идентификатор группы, а затем вставьте строку поправок с введенным значением группы. Если группа с определенной комбинацией уже была, просто захватите ее идентификатор и используйте его вместо этого.

declare @amendmentCombination nvarchar(max)
declare @groupID int
select amendmentCombination=string_agg(convert(nvarchar(max),AmendmentTypeID),',') WITHIN GROUP ( ORDER BY AmendmentTypeID asc)
from AmendmentType
where IsActive = 1 -- will only work for sql server version 2017. Search XML path concatenation if you don't have it
select @groupID=AmendmentTypeGroupID
from AmendmentTypeGroup
where AmendmentTypes=@amendmentCombination
if @groupID is null
begin
    insert AmendmentTypeGroup(AmendmentTypes) select @amendmentCombination
    set @groupID=SCOPE_IDENTITY() -- last id entered
end

insert Amendments(..your_other_columns...,AmendmentTypeGroup)
    select ..your_other_columns...,@groupID

Таким образом, для каждой строки Amendment вы можете присоединить ее к AmendmentTypeGroup, чтобы получить разделенный запятыми список доступных AmendmentTypes в то время. Вам придется разделить его, чтобы принять в табличной форме.

Чтобы сделать ваши данные более надежными, вам следует: 1) вручную создать все группы AmendmentTypeGroup, которые использовались для уже существующих строк в поправках, и вставить их идентификаторы в Amendment.AmendmentTypeGroup, чтобы вы могли затем 2) создать FK для поправки .AmendmentTypeGroup со ссылкой на AmendmentTypeGroup.AmendmentTypeGroupID 3) создать уникальное ограничение для AmendmentTypeGroup.AmendmentTypes

Как видите, это сложно. Действуй осторожно.

1 голос
/ 03 июня 2019

После ваших комментариев, я думаю, у меня есть решение для вас.

Создайте таблицу AmendmentTypeVersions, как это

ID | VERSION_NUMBER | AmendmentTypeId

и вставьте все активные типы поправок, используя версию 1

INSERT INTO AmendmentTypeVersions (VERSION_NUMBER ,  AmendmentTypeId)
    SELECT 1, AmendmentTypeID
    FROM AmendmentType
    WHERE isactive = 1

Каждый раз, когда вы сохраняете тип AmendmentType, получите максимальный номер версии и вставьте записи новой версии

DECLARE @LastVersion = (SELECT MAX(VERSION_NUMBER) FROM AmendmentTypeVersions)

INSERT INTO AmendmentTypeVersions (VERSION_NUMBER ,  AmendmentTypeId)
    SELECT @LastVersion + 1, AmendmentTypeID
    FROM AmendmentType
    WHERE isactive = 1

Добавить в столбец поправок с помощью VERSION_NUMBER и установить его в 1

Теперь все, что вам нужно сделать, это:

  • Когда вы создаете поправку, которую вы должны получить, установите для поправки VERSION_NUMBER значение @lastVersion (в операции редактирования у вас уже установлена ​​поправка VERSION_NUMBER)
  • всегда фильтруйте типы AmendmentTypes по VERSION_NUMBER поправки (вы должны присоединиться к типу поправки с типом AmendmentTypeVersions по VERSION_NUMBER поправки)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...