2012-07-13 98 views
0

我目前正在使用C#和asp.net爲我的項目做一個銀行網站。其中一項功能是「剩餘每日限制」。一旦我將系統日期更改爲另一天,我需要將數據庫值更改回默認值。例如:如果用戶有500美元(默認值)作爲每日限額,並且他全部用完了。第二天,他將再次獲得500美元。我可以知道該怎麼辦?如何在系統日期更改時默認數據庫值

+0

你可以分享你的數據庫模式看起來像什麼表,你有什麼等到目前爲止還嘗試過? – Nathan 2012-07-13 19:59:03

+0

這聽起來更像是一個數據庫設計問題,而不是C#,但我想這取決於你如何實現它。你可以添加一個列到你擁有的任何客戶表,說明他們的日常限制;那麼你可以保留一個交易表。如果你從他們的每日限額中扣除他們當天的交易總和,那麼你就會知道客戶剩下多少支出。我不確定這足以作爲答案,所以我把它作爲評論。 :) – 2012-07-13 20:01:37

回答

0

這裏是一個SQL腳本,將創造我怎麼會設置一些樣本數據的數據庫:

CREATE TABLE tblBankCustomer 
(
    BankCustomerId INT NOT NULL IDENTITY(1,1) PRIMARY KEY 
    , FirstName NVARCHAR(100) NOT NULL 
    , LastName NVARCHAR(100) NOT NULL 
    , DailySpendingLimit DECIMAL(38, 2) NOT NULL CONSTRAINT DF_tblBankCustomer_DailySpendingLimit DEFAULT(500) 
) 

CREATE TABLE tblTransactionType 
(
    TransactionTypeId INT NOT NULL IDENTITY(1,1) PRIMARY KEY 
    , TransactionType VARCHAR(50) NOT NULL 
) 

INSERT tblTransactionType (TransactionType) 
VALUES ('Deposit') 
    , ('Withdrawal') 

CREATE TABLE tblTransaction 
(
    TransactionId INT NOT NULL IDENTITY(1,1) PRIMARY KEY 
    , BankCustomerId INT NOT NULL 
    , TransactionDate DATE NOT NULL 
    , Amount DECIMAL(38, 2) NOT NULL 
    , TransactionTypeId INT NOT NULL 
) 

ALTER TABLE tblTransaction 
ADD CONSTRAINT FX_tblTransaction_tblBankCustomer 
FOREIGN KEY (BankCustomerId) 
REFERENCES tblBankCustomer(BankCustomerId) 

ALTER TABLE tblTransaction 
ADD CONSTRAINT FX_tblTransaction_tblTransactionType 
FOREIGN KEY (TransactionTypeId) 
REFERENCES tblTransactionType(TransactionTypeId) 

INSERT tblBankCustomer 
(
    FirstName 
    , LastName 
) 
VALUES ('Jeremy', 'Pridemore') 
    , ('K', 'YQ') 

INSERT tblTransaction 
(
    BankCustomerId 
    , TransactionDate 
    , Amount 
    , TransactionTypeId 
) 
VALUES 
    (1, CURRENT_TIMESTAMP, 48.50, 2) -- Jeremy, Today, $48.50, Withdrawal 
    , (1, CURRENT_TIMESTAMP, 300.00, 2) -- Jeremy, Today, $300, Withdrawal 
    , (1, CURRENT_TIMESTAMP, -200.00, 1) -- Jeremy, Today, $200, Deposit 
    , (2, CURRENT_TIMESTAMP, 285.00, 2) -- K, Today, $285, Withdrawal 
    , (2, CURRENT_TIMESTAMP, 215.00, 2) -- K, Today, $215, Withdrawal 
GO 
CREATE FUNCTION fGetRemainingSpendingLimit 
(
    @BankCustomerId INT 
    , @Date DATE 
) 
RETURNS DECIMAL(38, 2) 
BEGIN 
    SET @Date = ISNULL(@Date, CURRENT_TIMESTAMP) 

    DECLARE @RemainingLimit DECIMAL(38, 2) = 
    (SELECT 
     SUM([Transaction].Amount) 
    FROM tblBankCustomer Customer 
    INNER JOIN tblTransaction [Transaction] 
     ON [Transaction].BankCustomerId = Customer.BankCustomerId 
     AND [Transaction].TransactionDate = @Date 
    INNER JOIN tblTransactionType TransactionType 
     ON TransactionType.TransactionTypeId = [Transaction].TransactionTypeId 
     AND TransactionType.TransactionType = 'Withdrawal' 
    WHERE Customer.BankCustomerId = @BankCustomerId) 

    RETURN @RemainingLimit 
END 
GO 

-- Some sample selects 
SELECT dbo.fGetRemainingSpendingLimit(1, NULL) 
SELECT dbo.fGetRemainingSpendingLimit(2, NULL) 

然後在C#中,你應該知道客戶的ID爲您正在使用的客戶。如果您使用的是ADO.NET等,您可以直接調用此函數並使用代碼中的值。

+0

嗨,但是當我更改系統日期時,我可以知道自動重置該值的哪個部分? – KYQ 2012-07-14 07:06:35

+0

@KYQ對不起,沒有回答你的問題,我錯過了昨天的SO。使用這種技術,你不需要明確地重置他們的值爲不同的日期。您存儲1個價值,他們每天應該使用多少,以及您存儲他們的交易。然後你計算給定日期剩餘使用量是多少。 – 2012-07-16 15:32:39

0

默認值爲通常爲停留在某個配置文件中。在特定情況下,我會說,你可以

  • 或有默認值的table

  • tables其中可能有相應恢復功能有默認列值。

後,可以使用一些stored procedure恢復它們。

0

您可以創建SQL作業並安排它在每個午夜運行,在作業內您可以執行存儲過程將值重置爲$ 500。

0

在我看來,基於有可能在未來的其他要求,我有一個表,看起來像:

UserID AppliedOn Limit 
1   1/1/2012  500 
1   2/1/2012  750 

這給你的極限了歷史性的觀點,你可以給給用戶或數據庫。以同樣的方式,這就是我將如何應用當前的每日限制。

UserID AppliedOn Withdrawn 
1   1/10/2012 125 
1   1/10/2012 225 

現在在2012年1月1日,它將很容易確定什麼剩餘的限額是沒有任何工作或觸發器。再次,您將擁有可以爲其他功能進行數據挖掘的歷史價值。

SELECT 
    ul.Limit - uw.Sum as LimitLeft 
FROM 
    UserLimit ul 
    INNER JOIN (
    SELECT 
     UserID, 
     AppliedOn, 
     SUM(Limit) as Sum 
    FROM 
     UserLimit 
    Group by 
     UserID, 
     AppliedOn) uw on ul.UserID = uw.UserID 
         and ul.AppliedOn = uw.AppliedOn 
WHERE 
    ul.UserID = @userID 
    AND ul.AppliedOn = @dateInQuestion 

(由於Entity Framework的緣故,我的原始SQL技能可能有點生疏)。