4 Konstruktion
4.1 Förarbete
4.2.5 Create report
Sista steget i rapportverktyget är att skapa själva rapporterna och den stora ut-maningen var att skapa tabeller som har rätt utseende, uppdateras utan att sidan behöver laddas om och som sedan ska kunna kopieras till ett dokument utan att tappa formateringen. För varje rapportmall ska användaren endast behöva välja vilken Recording och Sweep det rör sig om varpå alla värden ska läsas in och skrivas ut i tabellerna.
För att skapa en rapport ska användaren välja:
Projekt → Rapportmall → Recording → Sweep Create report – Frontend
När man klickar på sidan ”3. Create report” görs först en kontroll om ett projekt redan är valt och sedan ifall en rapportmall är vald. Om dessa är valda sedan ti-digare skickas anropet direkt till vald rapportmall annars visas först en drop down-lista med projekt. När ett projekt väljs visas listan med tillgängliga rap-portmallar och när en mall valts anropas mallens vy. Om den valda rapportmal-len inte hittas visas ett felmeddelande där användaren ombedes kontakta syste-madministratören.
Figur 16: LINQ-anrop som lista både id samt namn för mätprojekt return new SelectList(_context.Projects
.Select(x =>
new {
ProjectId = x.ProjectId,
Project = x.TestId + " | " + x.ProjectName })
.OrderBy(n => n.Project), "ProjectId", "Project", ProjectId);
Varje rapportmall består av ett antal olika delar:
• Drop down-listor med valt projekt samt valt rapportmall.
• En inledande tabell som alltid redovisas för samtliga rapporter.
• Den specifika tabellen för rapportmallen.
• Ett antal drop down-listor med Recordings.
• Ett antal drop down-listor med Sweep.
Eftersom många delar av varje mall kan återanvändas har allt innehåll skapats i form av partiella vyer förutom den specifika tabellen. Det gör att drop down-lis-torna för projekt, rapportmall, Recordings och Sweep endast behöver skapas på ett ställe och sedan inkluderas. För att sedan anpassa innehållet läses data in med AJAX, skickas till den partiella vyn och endast den partiella vyn behöver uppdateras. På så sätt kan delar av sidan uppdateras utan att behöva ladda om hela sidan. Genom att blanda AJAX och Razor kan funktionen Url.Action() an-ropa metod och controller samt att det går att skicka med de värden som meto-den behöver.
I figur 17 anropas metoden GetSweeps(), i controllern ReportController, och värden för RecordingId samt SweepId skickas med. Eftersom inget Sweep valts ännu skickas värdet -1 vilket resulterar i en lista utan något förvalt Sweep.
GetSweeps() skapar en ny drop down-lista som den fyller med värden från data-basen enligt de id:n som skickas och returnerar sedan dessa till den partiella vyn _SweepsPartial som i sin tur uppdateras med det nya innehållet. På samma sätt fungerar alla de partiella vyerna.
En utmaning var att innehållet måste presenteras i tabeller med HTML-taggen
<table> eftersom de annars inte går att kopiera till ett dokument utan att tappa formateringen. Först gjordes ett försök att skapa tabellerna i de partiella vyerna men snabbt konstaterades att det inte kommer fungera eftersom en tabell kan in-nehålla flera kolumner som ska uppdateras separat. För att lösa det skapas tabel-lerna i rapportmallens vy och ett id sätts på varje cell. Sedan uppdateras inne-hållet i tabellen med hjälp av JavaScript från den partiella vyn (se figurerna 18
Figur 17: Exempel på ett AJAX-anrop som hämtar alla Sweeps för en Recording
$('#commonTableRecordings').
on("change", async function () { await $("#commonTableSweeps").
load("@Url.Action("GetSweeps", "Report")?RecordingId=" +
$("#commonTableRecordings > select >
option:selected").val() +
"&SweepId=-1");
});
Drop down-listorna för Recording och Sweep har med flit lagts nedanför tabel-lerna för att inte komma med när en tabell kopieras till ett dokument. För att göra rapportverktyget mer användarvänligt och undvika förvirring har funktion lagts till i de fall en Recording samt Sweep först väljs och informationen skrivs ut i vyn men där användaren ändrar sig. Om användaren väljer en annan Recor-ding eller av någon anledning väljer standardvärdet för Sweep tas all informa-tion bort från tabellen genom att den skrivs över med tomt innehåll.
Create report – Backend
För att hantera alla metoder kopplade till rapporterna används controllern Re-portController och precis som med SettingsController börjar controllern med att kontrollera om ett projekt redan är valt. Om inget projekt är valt ser flödet ut enligt följande:
1. Index() - ReportController börjar med att köra Index() metoden som re-turnerar en vy med drop down-listan för projekt. Efter att ett projekt valts skickas anropet till metoden TestType().
2. TestType(int ProjectId, string Message) – Metoden tar argument för ProjectId samt Message. Med hjälp av ProjectId hämtas en uppdaterad projektlista via metoden GetProjects(ProjectId) som returnerar listan med valt projekt som markerat. Sedan hämtas en lista med tillgängliga rapportmallar via metoden GetTestTypes(int ProjectId, int TestTypeId) som tar argument för ProjectId samt TestTypeId. Eftersom ingen rap-portmall ännu valts returneras listan utan att någon är markerad. Båda listorna sparas i Viewbags och om det skickats med ett meddelande till metoden sparas även det i en Viewbag som alla sedan returneras till vyn. I metoden TestType() sparas även ProjectId till en session för att hålla reda på vilket val som gjorts. När en rapportmall väljs fortsätter anropet till SelectTest().
Figur 19: Exempel på hur en tabell-cell uppdateras med hjälp av JavaScript
$(document).ready(function () {
Figur 18: Exempel på en tabell-cell med id i rapportmallens vy
<tr>
<td class="table-text-right">Duration</td>
<td id="heatRunDuration" class="table-text-center"></td>
</tr>
3. SelectTest(int TestTypeId) – Denna metod har till uppgift att kontrol-lera vilken rapportmall som valts och skicka anropet vidare till metoden Report(). Eftersom rapporttyperna anges med en textsträng, i Percep-tion, är detta löst genom att först göra om textsträngen till gemener och sedan söka efter nyckelord (se figur 20).
Skulle metoden inte hitta sökorden i textsträngen returneras ett felmed-delande och anropet skickas till TestType() som skriver ut medfelmed-delandet.
I SelectTest() sparas också sessionen för vald rapportmall.
4. Report(string CurrentView, int ProjectId, int TestTypeId) – Efter-som alla rapportmallar är uppbyggda på samma sätt var ambitionen att kunna ladda dem med hjälp av en enda metod. Därför är första argu-mentet för Report() vilken vy som ska laddas. När vyn laddas får den med sig listor med valt projekt samt rapportmall men nu skickas även en lista med tillgängliga Recordings. Dessa hämtas med metoden Get-Recordings() som tar argument för TestTypeId och RecordingId.
5. GetSweeps(int RecordingId, int SweepId) - När användaren väljer en Recording i vyn körs metoden GetSweeps() med hjälp av ett AJAX-an-rop. Metoden returnerar en uppdaterad lista med Sweeps till den partiel-la vyn som hanterar Sweeps-listan. Med hjälp av RecordingId väljs rätt Sweep från databasen och användaren kommer endast att se relevant in-formation.
6. GetValues(string Partial, int TestTypeId, int RecordingId, int SweepId) – Det sista steget är att välja Sweep och då körs metoden GetValus() med hjälp av ett AJAX-anrop. GetValues() behöver veta vil-ken partiell vy som ska få tillbaka värdena och tar detta som första ar-gument. Med hjälp av de övriga argumenten hämtas berörda värden, da-tum samt vilka testobjekt som används i testet. Metoden uppdaterar också listorna för Recording och Sweep genom att sätta respektive val som markerade.
Om session finns för ProjectId kommer anropet gå vidare till TestType() (se punkt 2) alternativt om både ProjectId samt TestTypeId finns i sessioner
kom-Figur 20: Exempel på hur rapportverktyget söker efter testtyp och skickar information vidare till metoden Report
if (type.TestName.ToLower().Contains("maximum a.c. voltage"))