Отображение двух полей в поиске - PullRequest
1 голос
/ 30 ноября 2010

Введение сначала, вопрос в конце. Пожалуйста, прочитайте внимательно! <ч /> У меня есть отношение master-detail между двумя таблицами:

CREATE TABLE [dbo].[LookupAttributes] (
    [Id] int IDENTITY (1, 1) NOT NULL, 
    [Name] nvarchar (255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL) ;
ALTER TABLE [dbo].[LookupAttributes] ADD CONSTRAINT [PK_LookupAttributes] PRIMARY KEY ([Identity]) ; 

CREATE TABLE [dbo].[Lookup] (
    [Id] int IDENTITY (1, 1) NOT NULL, 
    [LookupAttributesLink] int NOT NULL, 
    [Code] nvarchar (20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
    [Value] nvarchar (80) COLLATE SQL_Latin1_General_CP1_CI_AS NULL) ;
ALTER TABLE [dbo].[Lookup] ADD CONSTRAINT [IX_Lookup] UNIQUE ([LookupAttributenLink], [Code]) ; 

обеих таблицах больше полей и индексов, но это те, которые имеют значение ...)

Проект, над которым я работаю, предназначен для хранения данных в более чем 50 таблицах, и каждую неделю эти данные экспортируются в XML для использования некоторыми настольными приложениями в качестве исходных данных. Хотя я хотел сделать это симпатичное приложение, его просто нужно было сделать быстро, поэтому я использую сайт динамических данных, чтобы данные можно было поддерживать. Работает просто отлично, кроме этой таблицы ...

Как выясняется, существует 600 различных записей поиска, которые имеют один и тот же код, но разные атрибуты. DDS правильно отображает атрибут и код в списке записей поиска, поэтому никогда не возникало путаницы относительно того, какую запись поиска кто-то редактировал. И это используется уже более 2 лет. <ч /> Теперь проблема: добавлена ​​новая таблица «Lookup-Override», которая ссылается на поле [Id] таблицы Lookup. Таким образом, каждая запись в этой новой таблице отображает поле [Код], но поскольку [Код] не уникален, непонятно, какая запись переопределения принадлежит какой записи поиска.
Чтобы решить эту проблему, мне нужно отобразить дополнительную информацию из записи поиска. Поскольку единственным уникальным набором полей является атрибут плюс код, мне нужно отобразить оба. Но отображение [LookupAttributesLink] + [Code] тоже не вариант, так как [LookupAttributesLink] это просто число.
Мне нужно DDS для отображения [Attributes]. [LookupAttributesLink] + [Lookup]. [Code] в одном столбце. Вопрос: как?
Я рассмотрел вопрос о добавлении вычисляемого поля в таблицу «Уточняющий запрос», но не могу получить имя атрибута таким образом.
Я мог бы создать специальную страницу для поддержки этой таблицы, но я не Мне тоже не нравится это решение, поскольку, по моему мнению, оно «нарушает» принцип DDS. Я пытаюсь избегать таких страниц.
Итак, есть ли другие способы заставить сайт отображать как имя атрибута, так и код поиска в таблице переопределения?


Наиболее интересным решением было бы использование вычисляемого поля, которое могло бы получить имя атрибута. Как это сделать?

Решил сам! Смотрите ответ ниже, который работает просто отлично.

1 Ответ

0 голосов
/ 30 ноября 2010

Нашли это! Мне пришлось сделать несколько вещей:

CREATE FUNCTION LookupName (
  @Attr int,
  @Code nvarchar(255)
) RETURNS nvarchar(1000)
AS
BEGIN
 DECLARE @Name nvarchar(1000)
 SELECT @Name = Name
 FROM [dbo].[LookupAttributes]
 WHERE [Id]=@Attr;
 RETURN @Name + '/' + @Code;
END
GO
ALTER TABLE [dbo].[lookup] ADD [Name] AS [dbo].[LookupName]([LookupAttributesLink], [Code])
GO

Это добавит дополнительное вычисляемое поле к таблице, которая использует функцию для вычисления правильного имени. Затем мне пришлось добавить некоторые метаданные для таблицы поиска:

[MetadataType(typeof(LookupMetadata))]
public partial class Lookup { }
[DisplayColumn("Name", "Name")]
[DisplayName("Lookup")]
public class LookupMetadata
{
    [ScaffoldColumn(false)]
    public int Id;
    [ScaffoldColumn(false)]
    public object Name;
}

Это позволит скрыть столбец Имя из самой таблицы поиска, но сделает его видимым для таблицы переопределения. (И он будет использоваться для отображения правильного значения.
Сделал это, решил проблему! Довольно просто, на самом деле. : -)

...