的情况下,发票号码基于交易发票,放在交易栏
您好,我建立一个客户Loyality系统,客户可以使用个人loyality卡获得积分,买这个点文章。 一般情况下,我们在处理三个方面:
- Loyality提供商(负责管理整个系统中的现金流)
- 店(-owners/-employees)(可出售或放弃指向客户或取分从客户)
- 客户(可以赚取或购买点/购买产品赚取或buyed点)
每周提供商需要生成每店发票基于开放交易表示的周期。
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 |
,同一客户还将购买antoher产品为€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]
的选择给出了以下结果:
| ToPay | ToReceive | Total | PeriodStart | PeriodEnd | LocationId |
| 3500 | 900 | 2600 | (Start) | (End) | 10001 |
而且会被插入到[发票]表。
问题
通过使用上面的查询,每一个位置(店)得到它的给定时期自己的纪录。 因此,每个位置都会在[发票]表中获取发票记录。
的[的recordId]列递增一个由每个插入(身份)
这是在那里我卡住: 每一个记录创建后,它需要[的recordId]被写入到[交易]表(在[InvoiceId]列中)用于在[发票]表中生成新记录的记录中,交易的[状态]列也需要从“打开”变为“发票”
I' m意识到能够获得最新记录的Recordid
SCOPE_IDENTITY();
谁能告诉我怎么做?
结果(因为它应该是)
当店主要求他/她的发票明细,交易可以通过InvoiceId选择人交易解决:
SELECT * FROM [Transactions] WHERE [InvoiceId] = @InvoiceId
补充信息
系统运行MSSQL 2008,前端运行MS MVC3(C#)。
UPDATE:我不得不改变我的datamodel了一下。
P.S.对于我的英语(不是那么好)的专业知识。
更新
OK,我固定它通过增加
UPDATE [Transactions] SET
[Transactions].[State] = 'Invoice',
[Transactions].[InvoiceId] = [Invoices].[RecordId]
FROM
[Transactions]
INNER JOIN
[Invoices]
ON
[Transactions].[CreatedDate] BETWEEN @PeriodStart AND @PeriodEnd
但我认为这只是一个黑客并没有做到这一点的方式。 我认为这是不对的原因是,可以在两个查询之间的表中进行一些更改(可以说是添加了一个事务)?这两个人都在同一个存储过程中。 现在,这是可以的,因为在商店关闭时,交易将在午夜进行解析。