0

案子

您好,我正在构建一个客户忠诚度系统,客户可以使用个人忠诚度卡来赚取积分并使用该积分购买商品。通常,我们与三方打交道:

  • 忠诚度提供者(管理整个系统的现金流)
  • 商店(-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

查询(到目前为止)

Is 能够编写(嗯,复制)一个 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      |

并将插入到 [Invoices] 表中。


问题

通过使用上面的查询,每个位置(商店)都会在给定的时间段内获得它自己的记录。因此,每个位置都会在 [Invoices] 表中获得发票记录。

[RecordId] 列每插入一次(身份)递增一

这就是我卡住的地方:每次创建记录后,需要将其 [RecordID] 写入 [Transactions] 表(在 [InvoiceId] 列中),用于在 [Invoices] 表中生成新记录的记录,还需要将交易的 [State] 列从“Open”更改为“Invoice”

我知道能够获取最新记录的 Recordid

SCOPE_IDENTITY();

谁能告诉我该怎么做?


结果(应该是这样)

当店主请求他/她的发票详细信息时,可以通过按 InvoiceId 选择所有交易来解决交易:

SELECT * FROM [Transactions] WHERE [InvoiceId] = @InvoiceId

附加信息

系统运行 MSSQL 2008,前端运行 MS MVC3 (C#)。

更新:我不得不稍微改变我的数据模型。

PS Appologies for my (not so gooed) English。

更新

好的,我通过添加来修复它

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

但我认为这只是一个技巧,而不是这样做的方法。我认为这不正确的原因是,两个查询之间的表(假设添加了一个事务)可以改变吗?他们都在同一个存储过程中。现在这没关系,因为交易是在午夜时分解析的,当时商店关门了。

4

1 回答 1

0

好的,我通过添加来修复它

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

但我认为这只是一个技巧,而不是这样做的方法。我认为这不正确的原因是,两个查询之间的表(假设添加了一个事务)可以改变吗?他们都在同一个存储过程中。现在这没关系,因为交易是在午夜时分解析的,当时商店关门了。

于 2012-11-11T16:40:39.157 回答