在查找中显示两个字段

时间:2010-11-30 14:15:23

标签: sql-server-2008 asp.net-3.5 dynamic-data

首先介绍,最后提问。请仔细阅读!

<小时/> 我在两个表之间有一个主 - 细节关系:

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”,它链接到Lookup表的[Id]字段。因此,此新表中的每个记录都显示[代码]字段,但由于[代码]不是唯一的,因此不清楚哪个覆盖记录属于哪个查找记录。
要解决这个问题,我需要从Lookup记录中显示更多信息。由于唯一唯一的字段集是属性加代码,我需要显示两者。但是显示[LookupAttributesLink] + [Code]也不是一个选项,因为[LookupAttributesLink]只是一个数字。
我需要DDS来显示[Attributes]。[LookupAttributesLink] + [Lookup]。[Code]在一列中。问题是:怎么样?
我考虑过将一个计算字段添加到Lookup表中,但是我无法获得这样的属性名称。
我可以创建一个特殊的页面来维护这个表但是我不知道这个解决方案也是如此,因为它在我看来“打破”了DDS原则。我试图避免这样的页面。
那么,获取网站的任何其他可能性都会在覆盖表中显示属性名称和查找代码?
最有趣的解决方案是使用可以检索属性名称的计算字段。怎么做?


自己解决了!请参阅下面的答案,该工作正常。

1 个答案:

答案 0 :(得分:0)

发现它!我不得不做一些事情:

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;
}

这将隐藏Lookup表本身的Name列,但它使Override表可见。 (它将用于显示正确的值 做完这个,解决了问题!实际上很简单。 : - )