2017-06-15 13 views
0

我有一個數據庫中有一些價格。例如,我有牛奶= 1€。 我希望價格不會被修改爲多於或少於10%。所以在這種情況下,您可以將價格設置在0.90或1.10之間。這很容易,但是,當價格被修改時,用戶可以在之後再次修改它。 (如果他把它設置爲0.9,那麼他可以將它設置在0.81和0.99之間,等等......)所以我想在一個變量中影響價格,例如每天早上9點,所以在一天內它不能改變多於或少於10%。如何每天影響一些變量C#asp.net

DataClassesDataContext db = new DataClassesDataContext(); 

List<ARTICLE> article = db.ARTICLE.ToList(); 

for (int i = 0; i < article.Count; i++) 
{ 
    switch (article[i].Name) 
    { 
     case "Milk": 
      if (decimal.Parse(Milk.Text, CultureInfo.InvariantCulture) <= 
       (article[i].Price/ 10) * 11 && decimal.Parse(Milk.Text, 
       CultureInfo.InvariantCulture) >= (article[i].Price/ 10) * 9) 
      { 
       if (decimal.Parse(Milk.Text, CultureInfo.InvariantCulture) != article[i].Price) 
       { 
        article[i].Price= decimal.Parse(Milk.Text, CultureInfo.InvariantCulture); 
       } 
      } 
      break; 
     case "Other thing": 
      //... etc 
    } 
} 
+0

你有試過什麼嗎?有可能有成千上萬的方法來實現這一點。你在告訴我你沒有拿出任何東西嗎? – Pikoh

+0

有很多這個問題的解決方案,例如一些服務與定時器..等等 –

+0

我已經添加了我所做的,我只想知道如何設置一個全局變量,例如數據庫中的價格每天,所以我可以用它作爲我的if語句 – Alexandre

回答

2

對此的一種可能的解決方案是添加一個PriceHistory表。

然後,每當您保存價格時,您都會檢查新價格是否有效,並且(如果是)向PriceHistory表中添加記錄。

的檢查將是這樣的:

SELECT TOP 1 MostRecentPrice 
FROM PriceHistory 
WHERE Item = 'Milk' and PriceDateTime < 'Today's Date (with midnight as the time)' 
ORDER BY PriceDateTime DESC 

然後驗證要保存新的價格是MostRecentPrice 10%以內。此外,請確保您處理沒有近期價格的情況(即,這是您第一次節省物料的價格)。

這樣做的另一個優點是,它不僅解決了您當前的問題,還可以隨時爲您提供有價值的信息。 「3周前牛奶的價格是多少?」那種事。

另外,你可以改變的驗證規則合理簡單 - 例如,你可以說「每天10%或每週20%沒有價格變化」 - 你不能,如果你不這樣做那樣容易沒有存儲完整的歷史。

+0

所以,如果我理解得很好,我有一個新的表格,包括所有的價格變化和日期。當我修改價格時,我檢查當天的第一個價格,看看它是否符合約束條件? – Alexandre

+0

差不多。 **在**之前,您可以寫出您昨天查看價格*的日期價格(這是我建議的查詢所做的)。然後您檢查您要寫入的價格是否在查詢返回的數量的10%以內。 – mjwills

+0

另外,如果可能的話,您應該詢問數據庫的日期時間,而不是從本地機器獲取。否則,您可以更改機器的本地日期,以便隨意更改價格。 :)請參閱https://stackoverflow.com/a/12106050/34092 – mjwills

3

所以,你想:

  • 保存起始價格爲每一天
  • 允許用戶更改價格的那一天,的N%的閾值內
  • 允許用戶每天多次更改價格(以修正更正,或者增加或減少價格,只要總差值爲< N%)

然後,在更改每日價格後,檢查它是否與基準價格相差不超過N%。

要解決這個問題,您需要使用三列:DailyPriceCurrentPrice,PriceModified。然後在編輯價:

if (record.PriceModified.Date != DateTime.Now.Date) 
{ 
    // First edit for today. 
    if (PriceWithinChangeThreshold(formData.NewPrice, record.CurrentPrice)) 
    {  
     // Save the old price as the new start price for today 
     record.DailyPrice = record.CurrentPrice; 
     record.CurrentPrice = formData.NewPrice; 
     record.PriceModified = DateTime.Now; 
    } 
} 
else 
{ 
    // This price has already been edited today. 
    if (PriceWithinChangeThreshold(formData.NewPrice, record.DailyPrice)) 
    { 
     // But it's within the threshold for today 
     record.CurrentPrice = formData.NewPrice; 
     record.PriceModified = DateTime.Now; 
    } 
} 

但在評論中討論,節約的價格作爲單純的十進制列通常是一個壞主意。考慮一下(歷史)報告,開具發票,稅收,貨幣和其他東西:「產品價格」是方式以上的數字。所以我建議完全以不同的方式儲存你的價格。請參閱mjwlls' answer

+1

假設基準價格爲1美元。這個解決方案是否允許一天後的價格爲1.21美元,兩天後的價格爲1.33美元等等? – mjwills

+0

不用擔心。一個容易犯的錯誤。 – mjwills

+0

但是,只保存修改日期也不是一個解決方案,因爲這不允許您每天更改一次價格,即使這些更改在閾值內(或者如果您想糾正不正確的價格變化)也是如此。所以你需要兩個。我正在編輯答案。 – CodeCaster

1

您可以保存上次修改日期的時間,並且可以在每次更改時對其進行驗證。

+0

我應該在哪裏保存它?在我的數據庫中有一個新的列? – Alexandre

+0

您需要將其存儲在數據庫中。 – mjwills

+0

即使總變化<10%,這也不允許您每天更換兩次價格。 – CodeCaster

0

您可以在您所有的Articles中引入lastModified成員。因此,你知道,如果你可能會或可能不會改變目前的產品:

class Article 
{ 
    DateTime LastModified { get; set; } 
} 

... 

foreach(var article in articles) 
{ 
    var timespan = DateTime.Now - article.LastModified; 
    if(timeSpan.TotalDays >= 1) ... 
} 
0

像「上次更改」的日期時間在表中創建一個列。在檢查「LastModified」的日期和月份是否與今天的日期不同之後,啓用修改按鈕。

它不能在應用程序本身完成,或者您需要在服務器上運行的東西,您可以使用webservice或以往任何方式進行查詢。

如果您不能修改表格,可能會創建一個上次修改日期的本地文件,但用戶可以修改它,所以要小心。