2012-11-10 35 views
0

的情况下,发票号码基于交易发票,放在交易栏

您好,我建立一个客户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 

但我认为这只是一个黑客并没有做到这一点的方式。 我认为这是不对的原因是,可以在两个查询之间的表中进行一些更改(可以说是添加了一个事务)?这两个人都在同一个存储过程中。 现在,这是可以的,因为在商店关闭时,交易将在午夜进行解析。

回答

0

OK,我固定它通过增加

UPDATE [Transactions] SET 
    [Transactions].[State] = 'Invoice', 
    [Transactions].[InvoiceId] = [Invoices].[RecordId] 
FROM 
    [Transactions] 
INNER JOIN 
    [Invoices] 
ON 
    [Transactions].[CreatedDate] BETWEEN @PeriodStart AND @PeriodEnd 

但我认为这只是一个黑客并没有做到这一点的方式。我认为这是不对的原因是,在两个查询之间可以改变表格(可以说是一个事务添加)?这两个人都在同一个存储过程中。现在,这没关系,因为在商店关闭时,交易将在午夜进行解析。