案例
您好,我正在构建一个客户忠诚度系统,客户可以使用个人忠诚卡来获得积分并购买带有此积分的文章。 一般来说,我们处理三方:
每周,提供商需要根据开放交易在每个商店生成发票。
100分等于1欧元,所以基本上每欧元(0,01欧元)都是我们系统中的一分。
因此,假设一位店员向客户出售10欧元 - 积分(1000点),这将产生以下交易:
| RecordId | Description | Credit | Debit | State | CreationDate ... CardId | LocationId | InvoiceId |
| (ID) | (Descr.) | 1000 | 0 | Open | ... | 10001 | NULL |
现在,顾客购买了3欧元的产品。 这将生成以下事务:
| RecordId | Description | Credit | Debit | State | CreationDate ... CardId | LocationId | InvoiceId |
| (ID) | (Descr.) | 0 | 300 | Open | ... | 10001 | NULL |
那个星期晚些时候,同一个顾客也会在同一家商店以2欧元的价格购买另一个产品。 这将生成以下事务:
| RecordId | Description | Credit | Debit | State | CreationDate ... CardId | LocationId | InvoiceId |
| (ID) | (Descr.) | 0 | 200 | Open | ... | 10001 | NULL |
另一位客户购买25欧元 - 积分(2500分) 这会生成以下事务:
| RecordId | Description | Credit | Debit | State | CreationDate ... CardId | LocationId | InvoiceId |
| (ID) | (Descr.) | 2500 | 0 | Open | ... | 10001 | NULL |
该客户购买4欧元的产品, - (400分) 这会生成以下事务:
| RecordId | Description | Credit | Debit | State | CreationDate ... CardId | LocationId | InvoiceId |
| (ID) | (Descr.) | 0 | 400 | Open | ... | 10001 | NULL |
因此店主需要向提供商支付(1000 - (300 + 200)= 500)+((2500 - 400) - 2100)= 26欧元。
发票
店员应在周末收到发票,并附上以下数据
Period Invoice - Week X
Period Start: dd-mm-yyyy
Period End: dd-mm-yyyy
Points sold: 3500
Points collected: 900
------------------------ -
Total: 2600
To pay: € 26,-
在某些情况下,店主只能获得资金,在这种情况下发票将是负面的。
数据库
好吧,我只会描述此查询所需的表格。
发票
[RecordId] [int] IDENTITY(10001,1) NOT NULL,
[Description] [varchar](50) NULL,
[ToPay] [int] NOT NULL,
[ToReceive] [int] NOT NULL,
[Total] [int] NOT NULL,
[PeriodStart] [datetime] NOT NULL,
[PeriodEnd] [datetime] NOT NULL,
[State] [varchar](10) NOT NULL,
[PaidDate] [datetime] NULL,
[CreatedDate] [datetime] NOT NULL,
[UpdatedDate] [datetime] NOT NULL,
[DeletedDate] [datetime] NULL,
[LocationId] [int] NOT NULL
交易的
[RecordId] [int] IDENTITY(10001,1) NOT NULL,
[Description] [varchar](50) NOT NULL,
[Credit] [int] NOT NULL,
[Debit] [int] NOT NULL,
[State] [varchar](10) NOT NULL,
[CreatedDate] [datetime] NOT NULL,
[UpdatedDate] [datetime] NOT NULL,
[DeletedDate] [datetime] NULL,
[CustomerId] [int] NOT NULL,
[EmployeeId] [int] NOT NULL,
[CardId] [int] NOT NULL,
[LocationId] [int] NOT NULL,
[InvoiceId] [int] NOT NULL
查询(到目前为止)
能够编写(ehm,复制)StoredProcedure以获取特定时期内的所有未结交易:
INSERT INTO [Invoices] ([Description], [ToPay], [ToReceive], [Total], [PeriodStart], [PeriodEnd], [LocationId])
SELECT
@Description AS [Description],
SUM([Credit]) AS [ToPay],
SUM([Debit]) AS [ToReceive],
SUM([Credit]) - SUM([Debit]) AS [Total],
@PeriodStart AS [PeriodStart],
@PeriodEnd AS [PeriodEnd],
[LocationId]
FROM
[Transactions]
WHERE
[State] = 'Open' AND
[CreatedDate] BETWEEN @PeriodStart AND @PeriodEnd
GROUP BY [LocationId]
select会给出以下结果:
| ToPay | ToReceive | Total | PeriodStart | PeriodEnd | LocationId |
| 3500 | 900 | 2600 | (Start) | (End) | 10001 |
并将被插入[发票]表格。
问题
通过使用上面的查询,每个位置(商店)在给定的时间段内获得自己的记录。 因此,每个位置都会在[发票]表中获取发票记录。
[RecordId]列按插入(标识)
递增1这是我被困的地方: 创建每个记录后,需要将[RecordID]写入[Transactions]表(在[InvoiceId]列中)用于在[Invoices]表中生成新记录的记录,也包括[State]列的交易需要从“打开”更改为“发票”
我知道能够使用
获取最新记录的RecordidSCOPE_IDENTITY();
谁能告诉我怎么做?
结果(应该如此)
当店主要求他/她的发票详细信息时,可以通过InvoiceId选择al交易来解决交易:
SELECT * FROM [Transactions] WHERE [InvoiceId] = @InvoiceId
其他信息
系统运行MSSQL 2008,前端运行MS MVC3(C#)。
更新:我不得不改变我的数据模型。
P.S。我的(不是那么糟糕的)英语的应用。
更新
好的,我通过添加
修复了它UPDATE [Transactions] SET
[Transactions].[State] = 'Invoice',
[Transactions].[InvoiceId] = [Invoices].[RecordId]
FROM
[Transactions]
INNER JOIN
[Invoices]
ON
[Transactions].[CreatedDate] BETWEEN @PeriodStart AND @PeriodEnd
但我认为这只是一个黑客而不是这样做的方式。 我认为这是不对的原因是,两个查询之间的表(可以说是添加了一个事务)有什么变化吗?他们都在同一个存储过程中。 现在这没关系,因为当商店关闭时,会在午夜解析交易。
答案 0 :(得分:0)
好的,我通过添加
修复了它UPDATE [Transactions] SET
[Transactions].[State] = 'Invoice',
[Transactions].[InvoiceId] = [Invoices].[RecordId]
FROM
[Transactions]
INNER JOIN
[Invoices]
ON
[Transactions].[CreatedDate] BETWEEN @PeriodStart AND @PeriodEnd
但我认为这只是一个黑客而不是这样做的方式。我认为这是不对的原因是,两个查询之间的表(可以说是添加了一个事务)有什么变化吗?他们都在同一个存储过程中。现在这没关系,因为当商店关闭时,会在午夜解析交易。