Flyttar till..

http://vs2010world.wordpress.com/

Jag flyttar till....

Vill få lite bättre struktur på den här bloggen och blogg.se har inte vad jag behöver så jag kommer att flytta till wordpress.com och sedan får vi se hur det blir.

http://vs2010world.wordpress.com/

Kommer fortfarande till större delen handla om C# och min utveckling från IT-Tekniker till Systemutvecklare


Ny vecka och fortsättning

Nu har det blivit en ny vecka igen.
Otroligt vad tiden bara rusar iväg, bara 26 dagar kvar till jul och endast en vecka kvar till jag åker till Stockholm på kurs (LearningTree).
Den kursen kommer att bli riktigt najs må jag säga :-) Hoppas på att man kommer att lära sig och behålla kunskapen också där ifrån.

Under förra veckan har jag pysslat en hel del med mitt lilla "försäkrings"-program (Lektion 7).
Har nog inte tillkommit så himla många nya funktioner i det förrutom ett par men har mer sysslat med felhanteringen bakom det och försökt hitta olika sätt att "göra det på".

Lägger till lite bilder och lite kod till de olika delarna så får vi se vad som händer efter det :-)
Det jag tror har utökat huvudmenyn lite är Uppdatera, Sortera och Visa Premie (E, F och G).
Se bilden nedan:




E - Uppdatera befintlig försäkring


Denna funktion börjar med att användaren matar in försäkringsid för vilken försäkrings som skall ändras.
Sendan får man skriva in samtliga värden igen med även de uppdateringar man vill göra.
I detta fall kommer start / enddate att uppdateras från den dagen man gör uppdateringen och 1 år fram.
Sedan får man se vad tidigare värden var och så får man även se de nya ändrade.

Program.cs

case "E":
case "e":
Console.Clear();
Console.Write("Ange försäkrings nummer du vill uppdatera: ");
if (!Int32.TryParse(Console.ReadLine(), out InsuranceID) || InsuranceID < 1)
{
Console.WriteLine("Du måste ange ett försäkringsnummer!");
do
{
Console.Write("Vänligen, Ange försäkringsnummer du vill uppdatera: ");
}
while (!Int32.TryParse(Console.ReadLine(), out InsuranceID) || InsuranceID < 1);
}

Insurance.InsuranceID = InsuranceID;
Insurance.Load();

Insurance incHist = new Insurance();
incHist.InsuranceID = Insurance.InsuranceID;
incHist.StartDatePeriod = Insurance.StartDatePeriod;
incHist.EndDatePeriod = Insurance.EndDatePeriod;
incHist.PremiumValue = Insurance.PremiumValue;
incHist.Value = Insurance.Value;
incHist.Rates = Insurance.Rates;
incHist.InsuranceHolder = Insurance.InsuranceHolder;
Insurance.copyObject(incHist);

Console.Write("Ange nytt Premiebelopp: ");
Insurance.PremiumValue = CheckPremiumValue(PremiumValue);
Console.Write("Ange ny Valuta: ");
Insurance.Value = CheckValue(Value);
Console.Write("Ange nya antal rater: ");
Insurance.Rates = CheckRates(Rates);
Console.Write("Ange ny försäkringstagaren: ");
Insurance.InsuranceHolder = CheckInsuranceHolder(InsuranceHolder);


// Tar hand om svaret från Insurance.Update i Insurance.cs
if (Insurance.Update())
{
Console.Clear();
Console.ForegroundColor = ConsoleColor.DarkYellow;
Console.WriteLine("\nTidigare försäkringsinformation:");
Console.ResetColor();
Console.WriteLine("Försäkringsnummer: " + incHist.InsuranceID + "\nFörsäkringstagare: " + incHist.InsuranceHolder + "\nStartdatum: " + incHist.StartDatePeriod.ToShortDateString() + "\t\tSlutdatum: " + incHist.EndDatePeriod.ToShortDateString() + "\nPremiebelopp: " + incHist.PremiumValue + "\t\tValuta: " + incHist.Value + "\nAntal Rater: " + incHist.Rates);
Console.ForegroundColor = ConsoleColor.DarkYellow;
Console.WriteLine("\n\nUppdaterad försäkringsinformation:");
Console.ResetColor();
Console.WriteLine("Försäkringsnummer: " + Insurance.InsuranceID + "\nFörsäkringstagare: " + Insurance.InsuranceHolder + "\nStartdatum: " + Insurance.StartDatePeriod.ToShortDateString() + "\t\tSlutdatum: " + Insurance.EndDatePeriod.ToShortDateString() + "\nPremiebelopp: " + Insurance.PremiumValue + "\t\tValuta: " + Insurance.Value + "\nAntal Rater: " + Insurance.Rates);
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("\nFörsäkringens period förnyas automatiskt 1 år från dagensdatum vid ändring!\n");
Console.ResetColor();
Console.WriteLine("\nTack, försäkringen uppdaterades i databasen!\nTryck på enter för att forstätta till huvudmenyn");
Console.ReadLine();
}
else
{
Console.Clear();
Console.WriteLine("Det gick åt helvete att sprar ner/uppdatera i databasen, kontakta databasadmin för hjälp!");
Console.WriteLine("Tryck enter för att återgå till huvudmenyn");
Console.ReadLine();
}

break;


Insurance.cs

public bool Update()
{
Insurance.DeleteInsurance(InsuranceID);
Insurance Save = new Insurance();
Save = this;

return Save.Save();
}

Denna hänvisar ju då även till metoden Save i som finns ovan. (Fortfarande i Insurance.cs)

public bool Save()
{
char pad = ' ';
StringBuilder data = new StringBuilder();
data.Append(InsuranceID.ToString().PadRight(10, pad));
data.Append(StartDatePeriod.ToShortDateString().Replace("-", "").Replace("/", "").Replace(".", "").PadRight(8, pad));
data.Append(EndDatePeriod.ToShortDateString().Replace("-", "").Replace("/", "").Replace(".", "").PadRight(8, pad));
data.Append(PremiumValue.ToString().PadRight(10, pad));
data.Append(Value.PadRight(3, pad));
data.Append(Rates.ToString().PadRight(2, pad));
data.Append(InsuranceHolder.PadRight(50, pad));
return FredrikDAL.DatabaseHelper.SaveInsurance(data.ToString());
}


DatabaseHelper.cs

public static bool SaveInsurance(string data)
{
string path = @"C:\Sytem007\Database\insurancedb.txt";

// Kontrollerar om ovanstående path är ok och då att filen finns
if (!File.Exists(path))
{
using (StreamWriter sw = File.CreateText(path))
{
sw.Write("");
}
}
using (StreamWriter sw = File.AppendText(path))
{
sw.WriteLine("{0}", data);
return true;
}
}


F - Sortera databasen:


Detta med sortera databasen behövs ju inte direkt OM man har en SQL eller liknande.
När man som jag gör och kör mot en fin textfil och den kommer lite i obalans tillsammans med den ovan, uppdatera en försäkring.
Då kan det plötsligt bli så att ordninge på InsuranceID inte riktigt är ok.
ex.
2
4
3
1

skulle det i detta fall vara så där och så lägger man till en ny försäkring så blir det lite skit som jag har det just nu eftersom jag kollar vad sista rades InsuranceID är och ökar det värdet med 1 för nästkommande försäkring.
Jah ni fattar säkerligen, så det jag använder den här metoden till är mer för nyskapande av försäkring så ropar jag på denna metod innan jag börjar att skapa en ny.

Hur ser den ut då? (går bara in på metoden i BLL och sedan hur DAL funkar)

Insurance.cs

public bool Sort()
{
if (!DatabaseHelper.SortDatabase())
{
return false;
}
return true;
}


DatabaseHelper.cs

public static bool SortDatabase()
{
List<string> lines = new List<string>();
string path = @"C:\Sytem007\Database\insurancedb.txt";
string temppath = @"C:\Sytem007\Database\tempinsurancedb.txt";
if (!File.Exists(path))
{
return false;
}

if (!File.Exists(temppath))
{
using (StreamWriter sw = File.CreateText(temppath))
{
sw.Write("");
}
}
using (StreamReader r = new StreamReader(new FileStream(path, FileMode.Open)))
{
string line;
while ((line = r.ReadLine()) != null)
{
lines.Add(line);
}
}
lines.Sort();
using (var sw = new StreamWriter(temppath))
{
for (int i = 0; i < lines.Count; i++)
{
string ListValue = lines[i] as string;
sw.WriteLine(ListValue);
}
sw.Close();
}
File.Delete(path);
File.Move(temppath, path);
return true;
}




G - Vad för premie:


Poängen med denna var då att skapa en metod som returnerar en decimal och som skall heta GetPremium.
Det den gör är att användaren får ange ett försäkrings ID och den skall returnera PremiumValue samt att jag även la till att den returnerar just efter PremiumValue även Value (vilken valuta det är).

Jag har även förberätt för att ta fram andra värden om så behövs.

Program.cs (UIL)

case "G":
case "g":
Console.Clear();
Console.Write("Ange försäkrings nummer: ");
if (!Int32.TryParse(Console.ReadLine(), out InsuranceID) || InsuranceID < 1)
{
Console.WriteLine("Du måste ange ett försäkringsnummer!");
do
{
Console.Write("Vänligen, Ange försäkringsnummer: ");
}
while (!Int32.TryParse(Console.ReadLine(), out InsuranceID) || InsuranceID < 1);
}
Insurance.InsuranceID = InsuranceID;    // Skickar över det inmatade försäkrings ID till Insruance.cs
if (Insurance.GetPremium() == 0)
{
Console.WriteLine("Tyvärr kan jag inte hitta försäkringen!");
}
Console.WriteLine("Försäkringsnummer: " + Insurance.InsuranceID + " Har premie: " + Insurance.PremiumValue + " " +Insurance.Value + "\nTryck enter för att fortsätta.");
Console.ReadLine();
break;


Insurance.cs


public decimal GetPremium()
{
string databasevalue = DatabaseHelper.LoadInsurance(InsuranceID, "insurancedb.txt", 10);
if (databasevalue == "")
{
decimal FaultOut = 0;
return FaultOut;
}
StartDatePeriod = Convert.ToDateTime(Convert.ToDecimal(databasevalue.Substring(10, 8)).ToString("####-##-##"));
EndDatePeriod = Convert.ToDateTime(Convert.ToDecimal(databasevalue.Substring(18, 8)).ToString("####-##-##"));
PremiumValue = Convert.ToDecimal(databasevalue.Substring(26, 10));
Value = databasevalue.Substring(36, 3);
Rates = Convert.ToInt32(databasevalue.Substring(39, 2));
InsuranceHolder = databasevalue.Substring(41);
return PremiumValue;
}



DatabaseHelper.cs

public static string LoadInsurance(int InsuranceID, string databasename, int lengthofidfieald)
{
string path = @"C:\Sytem007\Database\" + databasename;

int tempID;
// Kontrollerar om ovanstående path är ok och då att filen finns
if (!File.Exists(path))
{
throw new System.IO.FileNotFoundException("Databasen kunde inte hittas!", databasename);
}

// Läser igenom hela textfilen och letar efter angivet försäkringsID
// Returnerar den raden / försäkringen.
using (StreamReader sr = File.OpenText(path))
{
string rl = "";
while (!sr.EndOfStream)
{
rl = sr.ReadLine();
tempID = Convert.ToInt32(rl.Remove(lengthofidfieald));
if (tempID == InsuranceID)
{
return rl;
}

}
return "";
}
}

Projekt som Lektion 7 forts.

Hej på er,

Har varit helt fördjupad i detta med projektet.
Det går riktigt bra och har avancerat en aningen till att fixa försäkring via meny osv.
Skall försöka visa lite hur det är byggt just nu, håller på med en massa indatakontroller som inte är 100% klara än så ni får ha lite överseende med det hela.

Det hela bygger nu mera på UIL, BLL och även då DAL (min superfina notepad databas :P).
I FredrikUIL.UIL har jag då Program.cs som då är mer det användaren ser, matar in och pressenteras.
I FredrikBLL.BLL finns det Insurance.cs där just saker som skall göras med försäkringarna, dvs skickas vidare för inmatning till databasen osv.
Sedan har vi FredrikDAL.DAL som har DatabaseHelper.cs där jag har olika funktioner mot just min textfil.

Så här ser det ut just nu. (Gud vad jag önskade att man kunde få med formateringen också!)

FredrikUIL.UIL / Program.cs

using FredrikBLL.BLL;  // Alias

namespace FredrikUIL
{
public class Program
{
public static void Main(string[] args)
{
string myChoice;
Insurance Insurance = new Insurance();
do
{
// Här börjar Huvudmenyn!
Console.Clear();
Console.WriteLine("Välkommen till Försäkringsbolaget AB");
Console.WriteLine("Huvudmeny\n");

Console.WriteLine("A - Lägg till en försäkring");
Console.WriteLine("B - Ta bort en försäkring");
Console.WriteLine("C - Titta på alla försäkringar");
Console.WriteLine("D - Leta efter en försäkring");
Console.WriteLine("Q - Bye bye, ta ta, quit\n");

Console.Write("Dina val (A,B,C,D or Q): ");

myChoice = Console.ReadLine();

// Här börjar underdelarna till huvudmenyn beroende på val i just huvudmenyn.
switch (myChoice)
{
case "A":
case "a":
decimal PremiumValue = 0;
int InsuranceID = 0;
string Value = " ";
int Rates = 0;
string InsuranceHolder = " ";

Console.Clear();
Console.WriteLine("Du vill lägga till en försäkring\n");
Console.Write("Ange Premiebelopp: ");
PremiumValue = CheckPremiumValue(PremiumValue);
Console.Write("Ange valuta: ");
Value = CheckValue(Value);
Console.Write("Ange antal rater: ");
Rates = CheckRates(Rates);
Console.Write("Ange försäkringstagaren: ");
InsuranceHolder = CheckInsuranceHolder(InsuranceHolder);

// Sätter upp Startdate och Enddate till DateTime
DateTime StartDatePeriod = new DateTime();
StartDatePeriod = DateTime.Now;
DateTime EndDatePeriod = new DateTime();
EndDatePeriod = DateTime.Now;

Insurance.InsuranceID = InsuranceID;
Insurance.StartDatePeriod = StartDatePeriod.ToShortDateString().Replace("-", "").Replace("/", "").Replace(".", "");
Insurance.EndDatePeriod = EndDatePeriod.AddYears(1).ToShortDateString().Replace("-", "").Replace("/", "").Replace(".", "");
Insurance.PremiumValue = Convert.ToDecimal(PremiumValue);
Insurance.Value = Value.ToUpper();
Insurance.Rates = Rates;
Insurance.InsuranceHolder = InsuranceHolder;
Insurance.save();

Console.WriteLine("\nTack, försäkringen skapades i databasen!\n");
break;

case "B":
case "b":
Console.Clear();
Console.WriteLine("Du vill plocka bort en försäkring!");
Console.Write("Ange det försäkringsnummer du vill plocka bort: ");
break;


case "C":
case "c":
Console.Clear();
Console.WriteLine("Här nedan listas alla försäkringa från databasen.");
Console.Write(Insurance.ReadAllInsurances());
break;
case "D":
case "d":
Console.Clear();
Console.Write("Ange försäkrings nummer: ");
int MyID = Convert.ToInt32(Console.ReadLine());
if (MyID == 0)
{
Console.Write("Du måste ange ett försäkrings nummer!");
break;
}
else
{
Insurance.InsuranceID = MyID;
Console.Clear();
Console.WriteLine("Försäkring id " + MyID + " " + "tillhör:\n");
Console.WriteLine(Insurance.SearchForID(MyID));
break;
}

case "Q":
case "q":
Console.WriteLine("OK, Bye Bye!");
break;
default:
Console.WriteLine("{0} är inte ett giltigt val!", myChoice);
break;
}
Console.Write("\nTryck på en tangent för att återgå till huvudmenyn.");
Console.ReadLine();
Console.WriteLine();
}
while (myChoice != "Q" && myChoice != "q");

}


// Kontrollerar om PremiumValue verkligen håller sig till en decimal
private static decimal CheckPremiumValue(decimal PremiumValue)
{
if (!decimal.TryParse(Console.ReadLine(), out PremiumValue))
{
do
Console.Write("Felaktigt värde!\nVänligen, Ange Premiebelopp: ");
while (!decimal.TryParse(Console.ReadLine(), out PremiumValue));
}
return PremiumValue;
}

// Kontrollerar om Value har ett värde som går att läsa
private static string CheckValue(string Value)
{
Value = Console.ReadLine();

if (String.IsNullOrEmpty(Value))
{
while (String.IsNullOrEmpty(Value))
{
Console.Write("Felaktigt värde!\nVänligen, ange valuta (ex. SEK, EUR): ");
Value = Console.ReadLine();
}
}

return Value;
}

private static int CheckRates(int Rates)
{
if (int.TryParse(Console.ReadLine(), out Rates))
{
do
Console.Write("Felaktigt värde!\nVänligen, ange antal rater: ");
while (!int.TryParse(Console.ReadLine(), out Rates));

}
return Rates;
}

// Kontrollerar om InsuranceHolder har ett värde som går att läsa
private static string CheckInsuranceHolder(string InsuranceHolder)
{
if (String.IsNullOrEmpty(InsuranceHolder))
{
while (String.IsNullOrEmpty(InsuranceHolder))
{
Console.Write("Felaktigt värde!\nVänligen, ange försäkringstagarens namn: ");
InsuranceHolder = Console.ReadLine();
}
}

return InsuranceHolder;
}




FredrikBLL.BLL / Insurance.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FredrikDAL;

namespace FredrikBLL.BLL
{
public class Insurance
{

public int InsuranceID { get; set; }            // Försäkringsnummer
public string StartDatePeriod { get; set; }     // Startdatum på försäkringsperioden
public string EndDatePeriod { get; set; }       // Slutdatum på försäkringsperioden
public decimal PremiumValue { get; set; }       // Premiebelopp
public string Value { get; set; }               // Valuta  ex. SEK, EUR, NOK, DKR
public int Rates { get; set; }                  // Antal rater
public string InsuranceHolder { get; set; }      // Försäkringstagare
// public Insurance();                          // Default-konstruktor
// public Insurance(int InsuranceID);           // Konstruktor som tar ett försäkringsnummer

public bool save()
{
char pad = ' ';
StringBuilder data = new StringBuilder();
data.Append(GetMaxInsuranceID().PadRight(10, pad));
data.Append(StartDatePeriod.ToString().PadRight(8, pad));
data.Append(EndDatePeriod.ToString().PadRight(8, pad));
data.Append(PremiumValue.ToString().PadRight(10, pad));
data.Append(Value.PadRight(3, pad));
data.Append(Rates.ToString().PadRight(2, pad));
data.Append(InsuranceHolder.PadRight(50, pad));
return FredrikDAL.DatabaseHelper.Insert(data.ToString());
}

private static string GetMaxInsuranceID()
{
return DatabaseHelper.read();
}

public static string ReadAllInsurances()
{
return DatabaseHelper.readAll();
}

public static string SearchForID(int MyID)
{
int InsuranceID = MyID;
return DatabaseHelper.SearchAndGet(InsuranceID);
}
}
}




FredrikDAL.DAL / DatabaseHelper.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace FredrikDAL
{
public class DatabaseHelper
{
// Insert har hand om inmatning av data till insurancedb.txt
public static bool Insert(string data)
{
string path = @"C:\Sytem007\Database\insurancedb.txt";

// Kontrollerar om ovanstående path är ok och då att filen finns
if (!File.Exists(path))
{
using (StreamWriter sw = File.CreateText(path))
{
sw.Write("");
}
}
using (StreamWriter sw = File.AppendText(path))
{
sw.WriteLine("{0}", data);
return true;
}
}

public static string read()
{
string path = @"C:\Sytem007\Database\insurancedb.txt";

// Kontrollerar om ovanstående path är ok och då att filen finns
if (!File.Exists(path))
{
using (StreamWriter sw = File.CreateText(path))
{
sw.Write("");
}
}
// Läser textfilens sista rad in i s.
using (StreamReader sr = File.OpenText(path))
{
string s;
string id = "1";

while (!sr.EndOfStream)
{
s = sr.ReadLine();
if (sr.Peek() == -1)
{
s = s.Remove(10);
int InsuranceID = Convert.ToInt32(s);
InsuranceID++;
id = Convert.ToString(InsuranceID);
}
}
return id;
}

}

// readALL Läser igenom alla raderna i insurancedb.txt och pressenterar de
public static string readAll()

{
string path = @"C:\Sytem007\Database\insurancedb.txt";

// Kontrollerar om ovanstående path är ok och då att filen finns
if (!File.Exists(path))
{
using (StreamWriter sw = File.CreateText(path))
{
sw.Write("");
}
}
// Läser genom hela textfilen från början till slut och returnerar det till "line".
using (StreamReader sr = File.OpenText(path))
{
string line;
line = sr.ReadToEnd().Replace("\n", "");  // plockar med replace bort ett extra "newline"

return line;
}

}

// SearchAndGet har ett invärde (MyID) som är försäkringsnummret och som går ner o kollar om den finns
// Finns försäkringen pressenteras den på ett "snyggt" sätt.
public static string SearchAndGet(int MyID)
{
string path = @"C:\Sytem007\Database\insurancedb.txt";
string ReturnID = "";
// Kontrollerar om ovanstående path är ok och då att filen finns
if (!File.Exists(path))
{
using (StreamWriter sw = File.CreateText(path))
{
sw.Write("");
}
}

// Läser igenom hela textfilen och letar efter angivet försäkringsID
// Returnerar den raden / försäkringen.
using (StreamReader sr = File.OpenText(path))
{
string s;
while (!sr.EndOfStream)
{
s = sr.ReadLine();
string tempID = s.Remove(10);
int InsuranceID = Convert.ToInt32(tempID);

if (InsuranceID == MyID)
{
string tempStartDate = s.Substring(10, 8);
string tempEndDate = s.Substring(18, 8);
string tempPremiumValue = s.Substring(26, 10);
string tempValue = s.Substring(36, 3);
string tempRate = s.Substring(39, 2);
string tempInsuraceHolder = s.Substring(41);
ReturnID = "Försäkringsnummer: " + InsuranceID + "\n" + "Startdatum: " + tempStartDate + "\n" + "Slutdatum: " + tempEndDate + "\n" + "Premiebelopp: " + tempPremiumValue + "\n" + "Valuta: " + tempValue + "\n" + "Antal rater: " + tempRate + "\n" + "Försäkringstagare: " + tempInsuraceHolder + "\n";
}

}
if (ReturnID == "")
{
ReturnID = "Tyvärr finns ej en försäkring på det inmatade försäkringsnummret!";
}
return ReturnID;
}
}
}
}


Hur detta ser ut just nu kan ni se här: (Klicka på bilderna för att få de större!)


Ett litet större projekt som Lektion 7

Fick just litet större projekt att syssla med nu vilket verkar jävligt kul.

Lektion 7

  1. Skapa en ny publik klass i ditt BLL-Projekt som heter Insurance.
    Skapa properties för nedanstående egenskaper hos klassen med lämpligt namn och lämplig datatyp.
    (TIPS! Skriv "prop" och tryck 2 gågner på Tab)

    • Försäkringsnummer
    • Startdatum på försäkringsperioden
    • Slutdatum på försäkringsperioden
    • Premiebelopp
    • Valua
    • Antal rater
    • Försäkringstagare

    Lägg även till en default-konstruktor(inga parametrar) och en konstruktor som tar ett försäkringsnummer.

Det där är det första jag skall göra, kommer att fylla på detta inlägg när jag kommer till steg 2 senare.
Nu blir det att läsa lite, är dock redan i skrivandets stund klar med skapandet av properties som jag tror kommer att passa in. Och det är följande:

  • public int InsuranceID { get; set; }                  // Försäkringsnummer
  • public DateTime StartDatePeriod { get; set; }   // Startdatum på försäkringsperioden
  • public DateTime EndDatePeriod { get; set; }     // Slutdatum på försäkringsperioden
  • public decimal PremiumValue { get; set; }        // Premiebelopp
  • public decimal Value { get; set; }                     // Valuta
  • public int Rates { get; set; }                             // Antal rater
  • public string InsuraceHolder { get; set; }           // Försäkringstagare

Mer info kommer senare...

Lektion 07 - Klasser

Gomorron
Skall ta och börja läsa lite om klasser nu.

Om ni undrar vad det är jag läser ifrån så är det just nu från C# Station Tutorial
Tycker det är riktigt bra och förklara på ett bra sätt. Vissa fall kan det kanske vara lite svårt tycker jag för att förstå vissa saker där men då är det bara att googla vidare så hittar man alltid på en himla massa andra förklaringar och exempel.
Skulle det skita sig så frågar jag någon på jobbet helt enkelt :-)

Har i alla fall lyckats binda ihopp 2 stycken "solutions / projects" med varandra genom att länka in dom i en Solution Folder.
Har man redan fördigkompilerade filer så kör man ju bara in dessa dll filer som referenser.
Men har man bara ett par små Solutions som man även enkelt vill komma åt sorucen på så går det att lösa med Solutions Folders som blir som en Virtuell koppling, måste fortfarande lägga till cs filderna i references i din main/program.cs annars funkar det ju inte så bra!

Fortsättning på namespace

Fortsätter från detta.

3) Ta bort referensen till ClassLibrary1 och lägg till den på nytt men denan gång i debug.
Debugga projektet och försök "stiga in i" metoden med F11.

Anledningen till detta med kontrollen av debugging / Stiga in i för både i Release läge och Debug läge var just för att i web appar går det tydligen inte att göra det. Vet nu dock inte riktigt varför det fungerade i detta, kanske har med att det var i Console App.
Skall väll undersöka saken lite närmare om det är så att det skall vara så eller om jag i misstag kommit åt någon "feat." som stänger av den funktionen :-)
Men nu fortsätter vi...

4) Använd ovanstående program (finns i tidigare inlägg) men lägg till ett using-statement till ClassLibrary1.BLL och ta bort "onödig kod" vid metodanropet.

Men lägger helt enkelt bara till i Program.cs
using ClassLibrary1.BLL;

Så kan man i koden även ändra från:
Console.Write("Är det en arbetsdag idag? " + ClassLibrary1.BLL.Helper.myToday());

Till:
Console.Write("Är det en arbetsdag idag? " + Helper.myToday());

5) Skapa ytterligare ett nytt projekt av typen Class Library och där den till ClassLibrary2.
Spara ner den i System007-mappen. Skapa sedan en klass som heter Helper i detta projekt och lägg denna i ett namespace som heter ClassLibrary2.BLL. Skriv sedan en publik statisk metod som med en DateTime svara på frågan vad klockan är just nu. Kompilera i debug och release.

(ClassLibrary2)Helper.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassLibrary2.BLL
{
public class Helper
{
public static string TimeRightNow()
{
DateTime time = DateTime.Now; //sätter time till en DateTime och kör in vad datum/tid är just nu
return time.ToShortTimeString(); // returnerar värdet från time med kort variant av tid hh:mm
// return time.ToLongTimeString(); // returnerar värdet från time fast med lång variant av tid hh:mm:ss
}
}
}


6) Lägg till referens till ClassLibrary2.BLL i ditt huvudprojekt och lägg till ett using-statement till denna. Anropa sedan metoden som svara på om det är en arbetsdag och metoden som svara på var klockan är just nu och meddela användaren det.

Svar: Här kommer det att krocka om man inte gör nått åt befintlig kod.
Eftersom koden just nu är:
...
using ClassLibrary1.BLL;
...
Console.Write("Är det en arbetsdag idag? " + Helper.myToday());

Och jag skulle då lägga till klockan där så kommer det att bli så här:
using ClassLibrary1.BLL;
using ClassLibrary2.BLL;

Console.Write("Är det en arbetsdag idag? " + Helper.myToday());
Console.Write("\nKlockan är just nu: " + Helper.TimeRightNow());

så kommer den att gnälla över Helper! Den finns ju på 2 ställen och hur vet man i koden vilken ClassLibrary den skall använda?
Well i detta läge är nog tanken att jag skall göra följande:
...
Console.Write("Är det en arbetsdag idag? " + ClassLibrary1.BLL.Helper.myToday());
Console.Write("\nKlockan är just nu: " + ClassLibrary2.BLL.Helper.TimeRightNow());

Man kan även som nästa del i lektionen gör också.

7) Använd ovanstående program och modifiera using-satserna så dom får varsitt alias.
ClassLibrary1.BLL får heta BLL_1 och ClassLibrary2.BLL får heta BLL_2.
Modifiera anropen till de 2 metoderna så att dom använder resp. alias.

Svar: Så det jag gör är att ändra lite i Programs.cs till följande
using BLL1 = ClassLibrary1.BLL.Helper;  // Alias
using BLL2 = ClassLibrary2.BLL.Helper;  // Alias
...

onsole.Write("Är det en arbetsdag idag? " + BLL1.myToday()); // Skriver ut resultatet från ClassLibrary1.BLL.Helper.myToday
Console.Write("\nKlockan är just nu: " + BLL2.TimeRightNow()); // Skriver ut resultatet från ClassLibrary2.BLL.Helper.TimeRightNow

Och otroligt nog blir då svaret samma!

Är det en arbetsdag idag? True
Klockan är just nu: 15:39




Allt detta med namespace har varit inom samma "Solution / FredrikUIL" så skall plocka ut dessa 2 ClassLibrarys och lägga dom i en egen Solution och se om det går bra att anropa de även från den?!
Vi får se :-)





Referenser

En liten notice som jag någon gång skall kolla lite på är att man skall normalt inte kunna "stiga in i" en metod med F11 om den är i Release läge.
Skall då fungerar när den är i Debugläge.
Dock så funka det i båda lägena för mig och vet inte riktigt varför, skulle kunna vara att det är Console App jag jobbar med och inte Web.

Skall testa detta även i webprojekt senare när jag börjar med det får vi se ....

Namespaces exempel

Så då har jag börjat läsa på om Namespaces och kommer väll inte att skriva om det så mycket mer här än att visa lite övningar och exempel.

Lektion 06
1) Skapa ett nytt projekt av typen Class Library och döp den till ClassLibrary1. Lägg det i System007-mappen (lokal katalog på min dator). Skapa sedan i detta projekt en klass som heter Helper (jag döpte bara om den .cs fil(class1.cs) till helper) och lägg denna i ett namespace som heter ClassLibrary1.BLL.
Skriv i Helper en publik statisk metod som med ett bool svarar på frågan om det är en arbetsdag idag, d.v.s måndag t.o.m fredag. Kompilera den i debug och release.

helper.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassLibrary1.BLL
{
public class Helper
{
public static bool myToday()
{
DayOfWeek today = DateTime.Today.DayOfWeek;
if (today == DayOfWeek.Monday)
{
return true;
}
else if (today == DayOfWeek.Tuesday)
{
return true;
}
else if (today == DayOfWeek.Wednesday)
{
return true;
}
else if (today == DayOfWeek.Thursday)
{
return true;
}
else if (today == DayOfWeek.Friday)
{
return true;
}
else
{
return false;
}
}
}
}


2) Lägg till referens till realease-versionen av ClassLibrary1 i ditt huvudprojekt. Anropa sedan metoden för att ta reda på om du jobbar på din fritid eller inte och meddela användaren. Använde inte using-statement(using ClassLibrary1.BLL). Debugga projektet och försök "stiga in i" metodem med F11.

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FredrikUIL
{
public class Program
{
public static void Main(string[] args)
{
Console.Write("Är det en arbetsdag idag? " + ClassLibrary1.BLL.Helper.myToday());
Console.ReadLine();
}
}
}

Min "Solution explorer" för att visa vart referensen ligger till ClassLibrary1:


Resulatatet so far:
Tillhörande Lektion 02  2)


Namespaces

Då var det dags att börja läsa lite om namespaces.

OUT myCalcOut

Som sagt, det var ju nästan rätt det jag fixade till i tidigare inlägg.
Dock helt fel eftersom det var just användning av OUT parametern och inte ref jag skulle använda mig av.

Men så efter lite meck och lite hjälp av N då jag donade till det lite fel så vart det rätt.
Vill nog dock kontrollera lite mer om vad de stora skillnaderna är mellan just out och ref. Båda två fungerar uppenbarligen.

Här kommer min kåd för det hela då.

Program.cs
Console.Write("Enter value 1: ");
decimal value1 = Convert.ToDecimal(Console.ReadLine());

Console.Write("Enter value 2: ");
decimal value2 = Convert.ToDecimal(Console.ReadLine());

string out1 = "";
string out2 = "";
string out3 = "";
string out4 = "";
FredrikBLL.BLL.Functions functions = new FredrikBLL.BLL.Functions();
functions.myCalcOut(value1, value2, out out1, out out2, out out3, out out4);

Console.WriteLine("Svaret nedan: \n" + out1 + out2 + out3 + out4);
Console.ReadLine();


Functions.cs
public void myCalcOut(decimal value1, decimal value2, out string out1, out string out2, out string out3, out string out4)
{
decimal sumtemp;
sumtemp = Convert.ToDecimal(value1 + value2);
out1= Convert.ToString(value1 + "+" + value2 + "=" + sumtemp + "\n");
sumtemp = Convert.ToDecimal(value1 - value2);
out2= Convert.ToString(value1 + "-" + value2 + "=" + sumtemp + "\n");
sumtemp = Convert.ToDecimal(value1 * value2);
out3= Convert.ToString(value1 + "*" + value2 + "=" + sumtemp + "\n");
sumtemp = Convert.ToDecimal(value1 / value2);
out4= Convert.ToString(value1 + "/" + value2 + "=" + sumtemp + "\n");
}

Men skall forska vidare lite i detta med out och ref för att just lära mig lite mer om det innan jag går vidare.

Fortsättning på ref i void metoder

Tror det går bra det här!

Lektion 05
8) Skriv ett program som från konsolen möjliggör input av 2 numreriska värden. Skriv en metod för beräkning som tar dessa 2 värden in, men som även tar 4 stycken out-parametrar in.
Tilldela dessa parametrar summan, differensen, produkten och kvot. Skriv sedan ut resultatet åt användaren utifrån out-parametrarna.
Ex.
tal1 = 5
tal2 = 5

5+5=10
5-5=0
5*5=25
5/5=1

Nu har jag dock när jag verkligen läser detta inte alls använt mig av out-parameterar utan av åter igen ref.
Men det är enkelt fixat i vilket fall.
Dock så får ni se hur jag löste detta med då ref och inte out.

Program.cs
Console.Write("Enter value 1: ");
decimal value1 = Convert.ToDecimal(Console.ReadLine());

Console.Write("Enter value 2: ");
decimal value2 = Convert.ToDecimal(Console.ReadLine());

string x = "";
FredrikBLL.BLL.Functions functions = new FredrikBLL.BLL.Functions();
functions.myCalcOut(ref value1, ref value2, ref x);

Console.WriteLine("Svaret nedan: \n" + x);
Console.ReadLine();

Functions.cs
public void myCalcOut(ref decimal value1, ref decimal value2, ref string x)
{
decimal sumtemp, sumtemp2, sumtemp3, sumtemp4;
string sumout = "";

sumtemp = Convert.ToDecimal(value1 + value2);
sumout += Convert.ToString(value1 + "+" + value2 + "=" + sumtemp + "\n");
sumtemp2 = Convert.ToDecimal(value1 - value2);
sumout += Convert.ToString(value1 + "-" + value2 + "=" + sumtemp2 + "\n");
sumtemp3 = Convert.ToDecimal(value1 * value2);
sumout += Convert.ToString(value1 + "*" + value2 + "=" + sumtemp3 + "\n");
sumtemp4 = Convert.ToDecimal(value1 / value2);
sumout += Convert.ToString(value1 + "/" + value2 + "=" + sumtemp4 + "\n");
x = sumout;
}

Jag får återkomma med kåden för OUT!


Gammle kan och förstår sig på ref!

Man kan ju undra om ordspråket lära gamla hudar att sitta stämmer?
Försökte förstå och lära mig detta med ref parametern i metoder men stirrade mig helt blind på det hela ett bra tag innan jag tror kronan föll ner ordentligt. Min övning skulle då utöva sig på följande sätt.

Lektion 05 del 4-6 (3 olika delar jag nu gått igenom i lektion 5)
4) Skriv ett program som från konsolen möjligör input av ett förnamn. För en variabel x i Main-metoden där du lagrar detta namn.
Skriv även en statisk void-metod som tar en string y som parameter och som till denna y lägger första bokstaven i namnet. Skriv sedan ut x. Fundera lite innan du ser resultatet om vad det bör stå!

Svar: x i detta fall har inte förändrats alls eftersom vi inte har gjort nått med det än. Y kan dessutom inte returneras.
Skulle det gå så skulle y i detta fall skriva ut första bokstaven i det inmatade förnamnet från x.

Program.cs
Console.Write("Please enter your firstname: ");
string x = Convert.ToString(Console.ReadLine());
Console.Write("\nHey there, " + x);  //Skriver ut inmatat värde från användaren
Console.ReadLine();

Functions.cs
public void myName(string x)
{
string y = "";
y = x.Substring(0, 1); // Plockar fram första tecknet från värdet i x och kör in det i y.
// return = y   //Funkar inte här eftersom man inte kan returnera ett värde i en void.
}


5) Använd ovanstående program men ändra i metoden så att första bokstaven tilldelas variabeln x istället. Skriv sedan ut x. Fundera på innan vad det borde stå!

Svar: Ändringen som behöver göras är att ändra void till sträng och returnera x.

Functions.cs
public void myName(string x)
{
string y = "";
y = x.Substring(0, 1);
x = y;
return x;
}

6) Använd ovanstående program men ändra i metodens  parameteruppsättning så att inparametern är en referens (nyckelordet: ref). Fundera på innan vad det bör stå!

Svar: Om allt funkar som det skall borde resultatet bli första tecknet/bokstaven i förnamnet.

Program.cs
Console.Write("Please enter your firstname: ");
string x = Convert.ToString(Console.ReadLine());
Console.Write("\nHey there, " + x);                      //Skriver ut inmatat värde från användaren
FredrikBLL.BLL.Functions functions = new FredrikBLL.BLL.Functions();   // Skapar ett nytt objekt functions
functions.myName(ref x);
Console.WriteLine("\nYour names first letter is: " + x); //Returnerat värde från myPublicName
Console.ReadLine();

Functions.cs
public void myName(ref string x)
{
string y = "";
y = x.Substring(0, 1);
x = y;
}

Resultatet:




Kommer nu att fortsätta med sista i detta som är del 7.

7) Använd ovanstående program men ändra i metoden så att första bokstaven tilldelas variabeln y istället.
Skriv sedan ut x. Fundera....

Svar: Svaret blir ...... Det inmatade värdet!

Please enter your firstname: Fredrik

Hey there, Fredrik
Your names first letter is: Fredrik

Helg och static void

Liten så här mental note till mig själv en fredags eftermiddag som denna.

public static void myName(string namnet)

VOID i detta fall kommer inte att returnera nått värde alls.
Så får vi se hur det här kommer att gå.

Skall läsa lite till sen blir det helg, så trevlig helg på er alla!


Trevlig helg på er alla!



Check if int

Har just blivit klar med ett program som kontrollerar om ett värde är ett heltal eller ej.



Lektionen:
Skriv ett program som möjliggör input av ett heltal. Skriv en metod som svarar med ett boolskt värde hurvida det är ett heltal. Meddela användaren svaret.

Kan ju börja med att berätta a tt ett boolskt värde är sant eller falskt (true/false, 1/0).
Så det hela skall då kolla om värdet man skriver in är ett heltal (integer) och om det är det skall värdet då blir true.

Program.cs

Console.Write("Enter a number or someting: ");
string value = Convert.ToString(Console.ReadLine());
bool output;
FredrikBLL.BLL.Functions functions = new FredrikBLL.BLL.Functions();
output = functions.IntOrNot(value);
Console.WriteLine("The value you entered was: " + value + "\nIs this an integer? " + output);
Console.ReadLine();


Functions.cs

/// <summary>
/// Kollar in invärdet (value) är ett heltal eller ej
/// </summary>
/// <param name="value">invärde</param>
/// <returns>returenrar true eller false beror på om invärde är en integer/heltal.</returns>
public bool IntOrNot(string value)
{
try
{
int tempvalue = Convert.ToInt32(value); // Försöker omvandla value till en INT om det ej går blir det en catch
return true;
}
catch (FormatException) {  // möter inte upp parametern för ett intvärde och returnerar då false
return false;
}



Exempel med heltal:

Enter a number or someting: 3123123
The value you entered was: 3123123
Is this an integer? True


Exempel med övrig inmatning:

Enter a number or someting: 323g3r2323t33tgh
The value you entered was: 323g3r2323t33tgh
Is this an integer? False

RSS 2.0