我有两个SQL表:TableA和LookupTable。 TableA将LookupTableID(PK)存储为外键和其他一些字段。 LookupTable存储LookupTableID,PharmacyName,PharmacyAddress,PostCode,PharmacyTelephone,PharmacyFax,PharmacyEmail等。
TableA中的数据以Asp.net形式显示。表单的每一行都有两个按钮:“打印”按钮和“预览”按钮。当用户单击“打印”按钮时,文档中将生成包含来自LookupTable的药房信息(表A中的LookupTableID)以及TableA中的一些其他信息的pdf文档。此外,TableA中的Printed字段设置为true,并创建TableA中的新记录,打印和新创建的记录之间的唯一区别在于以下字段:StartDate,EndDate和Printed。在新创建的记录中,StartDate变为“打印记录的EndDate + 1天”,EndDate变为“打印记录的EndDate + 7天”,新创建的记录的Printed为false。
当用户单击“预览”按钮时,将在文档中生成包含来自LookupTable的药房信息(TableA中的LookupTableID)以及TableA中的一些其他信息的pdf文档。请注意,在这种情况下,系统不会创建新记录或打印为true。
我在上面的数据库设计中遇到的问题是:如果其中一列允许修改查找表中的PostCode并且用户点击预览按钮获取历史/打印记录,那么预览pdf文档将显示最新信息即新邮政编码而不是印刷时的邮政编码。我知道,这是一种预期的行为。但是,我希望在打印时显示历史记录的信息,以及仅显示尚未打印的记录的最新信息。
我的一个解决方法是将LookupTable视为库表,供用户选择药房,然后将所有内容(查找表中的所有字段)复制到所选药房的TableA。这将在数据库中创建大量重复数据。有没有更好的方法来实现我的目标?任何帮助将不胜感激。
答案 0 :(得分:1)
对于历史数据,(至少)有两种方法:
ValidUntil
日期存储信息。带有NULL的那个是当前的。可以找到类似于以下内容的旧数据:
DECLARE @test TABLE(id INT,ValidUntil DATETIME);
INSERT INTO @test VALUES(1,{d'2015-01-01'})
,(2,{d'2015-02-01'})
,(3,{d'2015-03-01'})
,(4,NULL);
DECLARE @ValidOn DATETIME={d'2015-01-02'}; --set any value you like, even NULL
WITH HelperDates AS
(
SELECT ISNULL(@ValidOn,GETDATE()) AS ValidOn
,(SELECT MAX(ValidUntil) FROM @test) AS MaxDate
)
SELECT TOP 1 tbl.*
FROM @test AS tbl
CROSS JOIN HelperDates AS hd
WHERE hd.MaxDate IS NULL OR hd.ValidOn > hd.MaxDate OR hd.ValidOn <= tbl.ValidUntil
ORDER BY tbl.ValidUntil ASC
特别是对于印刷品,我更喜欢这种方式
祝你找到最好的方法!
答案 1 :(得分:1)
这似乎是一种不必要的复杂且不灵活的方式,可以在每次打印时拍摄数据快照。看起来更好的选择是对两个表进行版本化并创建第三个表,该表只包含TableA ID和打印日期。无需复制数据。要在任何特定打印日期重现数据,只需使用打印日期查询截至该日期的版本化数据。无论从那时起它发生了多大的变化,你都会收到该日期出现的数据。
我在这里给出了类似情况的一个答案:
希望它有所帮助。