2012-11-10 36 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 

但我認爲這只是一個黑客並沒有做到這一點的方式。我認爲這是不對的原因是,在兩個查詢之間可以改變表格(可以說是一個事務添加)?這兩個人都在同一個存儲過程中。現在,這沒關係,因爲在商店關閉時,交易將在午夜進行解析。