的情況下,發票號碼基於交易發票,放在交易欄
您好,我建立一個客戶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
但我認爲這只是一個黑客並沒有做到這一點的方式。 我認爲這是不對的原因是,可以在兩個查詢之間的表中進行一些更改(可以說是添加了一個事務)?這兩個人都在同一個存儲過程中。 現在,這是可以的,因爲在商店關閉時,交易將在午夜進行解析。