2016-05-07 7 views
3

Ich habe eine Zusammenfassung der Übersicht, dass ich den Gesamtbetrag auf einem Kundenkonto nach Monat und Jahr anzeigen muss.ASP.Net MVC - Razor Anzeigen von Kontosummen für Kunden nach Monat/Jahr Spalten

Ich habe die linq Abfrage erstellt und Modelle anzeigen, die diese Daten erfolgreich aus der Datenbank ziehen.

Ich möchte diese Daten in einer Tabellenform z.

Ansicht Wunsch

enter image description here

Mein LINQ Code

var monthlyTotals = from t in db.InvoiceItems.AsEnumerable() 
           // where t.Invoice.LegalFile.IsClosed == false 
            group t by t.Invoice.LegalFile.Client into g 
            select new StatementSummaryVM 
            { 
             Client = g.Key, 
             GrandTotal = g.Sum(x => x.AmountInclVAT), 
             MonthlyTotals = from i in g 
               group i by new 
                { 
                 month = i.ItemDate.Month, 
                 year = i.ItemDate.Year 
                } 
               into d 
               select new MonthlyTotalsVM 
               { 
                Date = new DateTime(d.Key.year, d.Key.month,1), 
                Amount = d.Sum(s => s.AmountInclVAT) 
               } 
            }; 

      return monthlyTotals; 

     } 

My View Modell

public class StatementSummaryVM 
{ 
    [Display(Name = "File No.")] 
    public int Id { get; set; } 

    public Client Client { get; set; } 
    public IEnumerable<MonthlyTotalsVM> MonthlyTotals { get; set; } 
    [Display(Name = "Grand Total")] 
    [DisplayFormat(DataFormatString = "{0:C}")] 
    public decimal GrandTotal { get; set; } 
} 

public class MonthlyTotalsVM 
{ 
    [DisplayFormat(DataFormatString = "{0:MMM-yyyy}")] 
    public DateTime Date { get; set; } 
    [DisplayFormat(DataFormatString = "{0:C}")] 
    public decimal Amount { get; set; } 
} 

My Current Code anzeigen

<table class="table"> 
    <tr> 
     <th>File No.</th> 
     <th>Client</th> 
     <th>Grand Total</th> 

     @foreach (var item in Model) 
     { 
      <th></th> 
      foreach (var monthlyTotal in item.MonthlyTotals) 
      { 
       <th>@Html.DisplayFor(model => monthlyTotal.Date)</th> 
      } 
     } 
    </tr> 

    @foreach (var item in Model) 
      { 
     <tr> 
      <td>@item.Client.Id</td> 
      <td>@item.Client.Name </td> 
      <td>@item.GrandTotal</td> 

     @foreach (var monthlyTotal in item.MonthlyTotals) 
     { 
      <td>@Html.DisplayFor(model => monthlyTotal.Date)</td> 
      <td>@monthlyTotal.Amount</td> 
     } 
     </tr> 
    } 

</table> 

die wie folgt aussieht, wenn

gemacht

Aktuelle gerenderte Ansicht1: enter image description here

Im kämpfen diese korrekt angezeigt zu bekommen.

Jede Hilfe wäre wirklich appreciated.THANKS sein

+0

Das erste, was Sie tun müssen, ist entfernen ' @ Html.DisplayFor (Modell => monthlyTotal.Date)' in der zweiten 'foreach' Block –

+0

Hallo Stephen. Absolut. Ich habe es nur dort gelassen, um mir zu helfen, um zu sehen, wie das Datum des monatlichen Gesamtmodells ist, also kann ich versuchen, herauszufinden, wie man die Ansicht strukturiert –

+0

Also was versuchst du zu tun? Sie haben 2 Bilder gezeigt, die überhaupt keine Beziehung zueinander haben. Wenn das letzte Bild die "echten" Daten sind, wie sollte dann Ihre Tabelle aussehen? –

Antwort

1

Ihr vorhandener Code nur eine Sammlung von MonthlyTotalsVM zurückkehrt, wo tatsächlich ein Wert vorhanden ist und der Schlüssel, diese Arbeit zu machen, ist die Sammlung mit einem MonthlyTotalsVM für jeden Monat zu initialisieren in den Datumsbereich, den Sie anzeigen möchten, und aktualisieren Sie dann den entsprechenden Artikel in der Sammlung basierend auf dem Index des Monats.

Angenommen, Ihre Methode akzeptiert Parameter für die Startdate und die Anzahl der Monate in der Tabelle anzuzeigen, würden Sie Code

public ActionResult StatementSummary(DateTime startDate, int months) 
{ 
    // Get the start and end dates 
    startDate = new DateTime(startDate.Year, startDate.Month, 1); // ensure first day of month 
    DateTime endDate = startDate.AddMonths(months + 1); 
    // Initialize the model 
    List<StatementSummaryVM> model = new List<StatementSummaryVM>(); 
    // Filter the data and group by client 
    var data = db.InvoiceItems 
     .Where(i => i.ItemDate >= startDate && i.ItemDate < endDate) 
     .GroupBy(i => i.Invoice.LegalFile.Client); 
    // Create a StatementSummaryVM for each client group 
    foreach(var clientGroup in data) 
    { 
     StatementSummaryVM summary = new StatementSummaryVM(startDate, months) 
     { 
      Client = clientGroup.Key, 
      GrandTotal = clientGroup.Sum(x => x.AmountInclVAT) 
     }; 
     // Group by month/year 
     foreach(var monthGroup in clientGroup.GroupBy(x => new { Month = x.Date.Month, Year = x.Date.Year })) 
     { 
      // Get the index of the month 
      int index = ((monthGroup.Key.Year - startDate.Year) * 12) + monthGroup.Key.Month - startDate.Month; 
      summary.MonthlyTotals[index].Amount = monthGroup.First().AmountInclVAT; // or .Sum(m => m.AmountInclVAT) if there are multiple invoives per month 
     } 
     model.Add(summary); 
    } 
    return View(model); 
} 

sein und dann StatementSummaryVM Modell einen Konstruktor hinzuzufügen ändern, die die Sammlung initialisiert

public class StatementSummaryVM 
{ 
    public StatementSummaryVM(DateTime startDate, int months) 
    { 
     MonthlyTotals = new List<MonthlyTotalsVM>(); 
     for (int i = 0; i < months; i++) 
     { 
      MonthlyTotals.Add(new MonthlyTotalsVM() { Date = startDate.AddMonths(i) }); 
     } 
    } 
    ..... 
} 
+0

Vielen Dank Stephen. Ich habe ein paar Änderungen vorgenommen, da ich eine Liste von Rechnungsposten habe, die in der Rechnung summiert werden, aber ansonsten war Ihre Lösung genau richtig! Ich weiß nicht, wie du es machst, aber du bist etwas anderes. Vielen Dank ! –