根据交易生成发票,并将发票编号放在事务列中

时间:2012-11-10 21:04:21

标签: sql-server sql-server-2008

案例

您好,我正在构建一个客户忠诚度系统,客户可以使用个人忠诚卡来获得积分并购买带有此积分的文章。 一般来说,我们处理三方:

  • 忠诚提供者(管理整个系统中的现金流)
  • 购物(-owners / -employees)(可以向客户出售或赠送积分或从顾客那里获取积分)
  • 客户(可以赚取或购买积分/购买带有赚取或购买积分的产品)

每周,提供商需要根据开放交易在每个商店生成发票。

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]列的交易需要从“打开”更改为“发票”

我知道能够使用

获取最新记录的Recordid
SCOPE_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

但我认为这只是一个黑客而不是这样做的方式。 我认为这是不对的原因是,两个查询之间的表(可以说是添加了一个事务)有什么变化吗?他们都在同一个存储过程中。 现在这没关系,因为当商店关闭时,会在午夜解析交易。

1 个答案:

答案 0 :(得分:0)

好的,我通过添加

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

但我认为这只是一个黑客而不是这样做的方式。我认为这是不对的原因是,两个查询之间的表(可以说是添加了一个事务)有什么变化吗?他们都在同一个存储过程中。现在这没关系,因为当商店关闭时,会在午夜解析交易。