【问题标题】:SQL - reset cumulative value while keeping historical dataSQL - 在保留历史数据的同时重置累积值
【发布时间】:2011-12-19 16:27:18
【问题描述】:

在大学实习期间,我受命创建一个 Web 应用程序来管理我工作的工厂的维护操作。我是一名工业工程师,对数据库编程只有一点了解,所以也许这个问题会对你来说听起来很容易,我很抱歉。

情况是这样的:物品是模具,经过多次操作后需要普通维护(数量巨大,我说的是瓷砖制造,维护频率可以假设为每年一次的平均值) .我建立了一个数据库和与之连接的Web应用程序,并创建了一个带有模具列表和相对累积工作的视图,以便部门负责人可以快速了解情况并查看哪些模具需要维护,并且效果很好。

问题是他们“标记”了模具,我使用该数字作为数据库中的行 ID。进行维护时,需要重置累积工作,但他希望保留有关工作操作的历史数据。

因此,我现在需要做的是“告诉系统”当一个项目被维护时,它必须在保留历史数据的同时重置累积值。

我创建的视图的值取自 2 个不同的表:Molds 和 UnmountingOperations。在后者中,有关于模具安装在哪台压力机上以及该操作期间完成的总工作量的信息。我认为解决方案是使用触发器,但我想问一下:

这样做的最佳做法是什么?

这里是 SqlServer management studio 创建的脚本。抱歉,记录名称是意大利语。 模具表:

CREATE TABLE [dbo].[Stampo](
[ID] [int] NOT NULL,
[Formato] [nchar](10) NOT NULL,
[n∞ uscite] [int] NULL,
[Spessore] [nchar](10) NULL,
[Descrizione] [nvarchar](max) NULL,
[Fornitore] [nvarchar](50) NULL,
CONSTRAINT [PK_Stampo] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,       ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

压表:

CREATE TABLE [dbo].[Pressa](
[Numero] [int] NOT NULL,
[Modello] [nchar](10) NULL,
CONSTRAINT [PK_Pressa] PRIMARY KEY CLUSTERED 
(
[Numero] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,  ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

联合模压机(mq_pressati)是工作量驱动器,代表压制的平方米:

CREATE TABLE [dbo].[SmontaggioStampi](
[NumeroPressa] [int] NOT NULL,
[IDStampo] [int] NOT NULL,
[DataSmontaggio] [datetime] NOT NULL,
[mq_pressati] [int] NOT NULL,
[Descrizione] [nvarchar](max) NULL,
CONSTRAINT [PK_Produzione presse] PRIMARY KEY CLUSTERED 
(
[NumeroPressa] ASC,
[IDStampo] ASC,
[DataSmontaggio] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[SmontaggioStampi]  WITH CHECK ADD  CONSTRAINT  [FK_SmontaggioStampi_Pressa] FOREIGN KEY([NumeroPressa])
REFERENCES [dbo].[Pressa] ([Numero])
GO

ALTER TABLE [dbo].[SmontaggioStampi] CHECK CONSTRAINT [FK_SmontaggioStampi_Pressa]
GO

ALTER TABLE [dbo].[SmontaggioStampi]  WITH CHECK ADD  CONSTRAINT [FK_SmontaggioStampi_Stampo] FOREIGN KEY([IDStampo])
REFERENCES [dbo].[Stampo] ([ID])
GO

ALTER TABLE [dbo].[SmontaggioStampi] CHECK CONSTRAINT [FK_SmontaggioStampi_Stampo]
GO

【问题讨论】:

  • 请给我们看一些表定义。关于业务规则:模具可以在没有维修的情况下卸下+安装吗?
  • 请提供表定义和一些代码。解释中是否缺少某些内容。
  • 抱歉,这是我的第一篇文章。 @wildplasser 是的,模具可以在维修前多次安装-卸载
  • 重置计数器似乎是合乎逻辑的。只需在每次服务中记录{mold_id,date,mileage, ...},然后让mold->mileage 愉快地打勾。 [为您的汽车更换机油时,车库是否会将里程数归零?]
  • @wildplasser 我的问题是,一旦模具维修完毕,对于相同数量的材料平方米,它会再次工作。使用此应用程序的人需要查看自上次服务以来的里程。我可以做的是记录服务日期,然后在应用程序中显示的视图中仅总结自该日期以来的工作量(也许这就是你的意思,如果是这样,我很抱歉,我没有明白)。我怎样才能做到这一点?

标签: sql triggers


【解决方案1】:

至于最佳实践,“避免像瘟疫这样的触发因素”是我能给你的最佳建议。

我在类似情况下所做的是添加一列,指示行现在已存档。我使用了一个名为ArchivedDtdatetime 列。普通查询排除此列,例如:

where  ArchivedDt is null

您甚至可以在视图中执行此操作。分层数据仍然存在,并且可以轻松撤消特定的存档运行。

【讨论】:

  • 你能不能再明确一点,我不明白。那么我如何监控自上次服务以来的工作量?
  • @MarcoBi:监控工作量的查询将包含where ArchivedDt is null,因此它只列出新工作。这有意义吗?
  • 嗯,我认为确实如此。但我正在考虑在模具表中添加一个新列,其中包含最后一次维护服务执行的日期,然后执行查询,该查询将返回从该日期开始执行的工作总和,如果不为空的话。这有意义吗?
  • 据我所知,这是一个不错的选择:您可以轻松更改 MaintenanceDt,并且仍然保留整个历史记录。另一种选择是创建一个 MoldMaintenance 表,这样您还可以保留维护日期的历史记录!
  • 我选择了我的解决方案。我认为这是迄今为止最简单的,并且它的用途非常好。谢谢你带我走正确的路。欢呼
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
  • 2018-07-12
  • 1970-01-01
相关资源
最近更新 更多