2011-09-08 60 views
-2

我有發票表和我的數據庫ClientPayments表。我有確認付款已經發生的代碼,並將其註冊到選定的發票(用戶在視圖中選擇發票)。一旦總付款金額等於發票金額,我試圖將發票的狀態更改爲「已確認」。對於一次發票可以有多次付款,並且如果付款金額小於發票金額,則狀態更改爲「部分付款」。這是從下面的控制我的代碼:加起來的金額從數據庫MVC 3

public ActionResult Confirm(int id, long InvoiceAmount, string PaymentType, float? InvoiceCustomAmount) 
    { 
     var invoice = db.Invoice.Find(id); 

     //now validate that if the logged in user is authorized to select and confirm this invoice or not. 
     ClientPayments clientPayment = db.ClientPayments.FirstOrDefault(cp => cp.InvoiceNumberID == id); 

      clientPayment = new ClientPayments(); 

      clientPayment.InvoiceNumberID = id; 

      var TotalPayments = (clientPayment.PaymentAmount + InvoiceAmount); 

     if (InvoiceAmount == 115) 
     { 
      clientPayment.PaymentAmount = (long)InvoiceCustomAmount; 
     } 
     else 
     { 
      clientPayment.PaymentAmount = InvoiceAmount; 
     } 

      clientPayment.PaymentType = PaymentType; 
      clientPayment.PaymentDate = DateTime.Now; 
      db.ClientPayments.Add(clientPayment); 

     if (TotalPayments != invoice.InvoiceAmount) 
     { 
      invoice.InvoiceStatus = "Partly Paid"; 
     } 
     else 
     { 
      invoice.InvoiceStatus = "Confirmed"; 
     } 

     // You don´t need this, since "invoice" was retrieved earlier in the method the database context 
     // knows that changes have been made to this object when you call "SaveChanges". 
     // db.Entry(invoices).State = EntityState.Modified; 

     db.SaveChanges(); 

     return View(); 
    } 

我遇到的問題是,TotalPayments不給我的總付款金額 - 它不添加了那些已經被添加到數據庫中的條目。

感謝

+0

ClientPayment「全額支付」計劃** S **是一個單一的支付對平衡這個金額是多少?你不是說有超過一筆付款,你是檢索一個單一的記錄。 – Bas

+0

我想將ClientPayments表中所有付款的所有金額相加,那麼如何檢索所有記錄? – Amy

回答

2

看起來你加載這裏clientPayment

ClientPayments clientPayment = db.ClientPayments.FirstOrDefault(cp => cp.InvoiceNumberID == id); 

現在你已經設置基準以新ClientPayments,不再加載

clientPayment = new ClientPayments(); 

這裏你設置InvoiceNumberID ,但沒有別的

clientPayment.InvoiceNumberID = id; 

現在您的設置TotalPayments到INVOICEAMOUNT(clientPayment.PaymentAmount爲0或空)

var TotalPayments = (clientPayment.PaymentAmount + InvoiceAmount); 

然後設置clientPayment.PaymentAmount晚,但畢竟你已經設置的TotalPayment。

我錯過了什麼嗎?

編輯:

我覺得你的親密。當您從數據庫獲得付款時,我認爲您不需要FirstOrDefault。我想你想要一筆錢。

所以,如果你剛開支付的款額,使用這樣的:

var totalPaid = ClientPayments.Where(cp => cp.InvoiceNumberID == id).Sum(cp => cp.PaymentAmount); 

現在,您可以從數據庫中有你的總。

而且,這是什麼? InvoiceAmount == 115? 115被稱爲魔術數字。這對任何閱讀你的代碼都沒有任何意義。考慮使用常量或枚舉。 例如,

 const int totalInvoiceAmount = 115; 

那麼你的代碼會讀,

if (InvoiceAmount == totalAmountOwed){...} 

那麼我認爲你可以繼續創建新的ClientPayment爲你所做的一切。然後相應地設置值。

它看起來像你需要獲得用戶支付的金額,並添加到我們前面拿到了總。然後,您可以檢查欠確定發票狀態,請執行應該是「確認」或

+0

我不認爲你錯過了任何東西,但我對MVC和C#非常陌生,所以我錯過了很多!你能幫我解決嗎?它主要是那些奇怪的陳述的順序嗎? – Amy

+0

讓我告訴你什麼都是:clientPayment應該是按下按鈕時保存到數據庫的支付金額。 InvoiceAmount是單選按鈕的名稱,這是用戶選擇的付款金額。而invoice.InvoiceAmount是數據庫中「發票」表中的實際金額 – Amy