Closed Thread
Page 1 of 2 12 LastLast
Results 1 to 10 of 14

Thread: Cashflow\\ Any suggestions?

  1. #1
    Demodex is offline Learning Programmer
    Join Date
    Dec 2009
    Posts
    34
    Rep Power
    0

    Cashflow\\ Any suggestions?

    I want to make a small app using c# that will help me control my cash flow.

    I would input to the program each time the amount of money I spent (after each day I will enter this day's expenses and it will be added to the program database).

    I know this program should include the following factors:

    A calendar that will show me each day's expenses.
    Some integers, not too difficult to grasp.
    A database that will hold each day's expenses (how should I do that?).
    A save function (no idea how to do that one).

    Any recommendations on how to make it?
    I know it shouldn't be THAT hard and that this is kind of a Low-level usage of the language, so the inexperienced c# newbie should grasp this project maybe not too easily, but he should.

    Speak, my friends
    Demodex is one of the parasitic face mites that occur on people
    These parasites are found in the hair, normally found in greater numbers around the cheeks and foreheadWatch out !!!

  2. CODECALL Circuit advertisement
    Join Date
    Always
    Posts
    Many

     
  3. #2
    PGP_Protector's Avatar
    PGP_Protector is offline Programming Professional
    Join Date
    Jun 2009
    Posts
    253
    Rep Power
    11

    Re: Cashflow\\ Any suggestions?

    If this isn't an assignment, just do this in a spreadsheet.
    If it is, take a look at using SQLite to handle your database functions. (Love it & use it at my job for configuration files / calibration files )

  4. #3
    Demodex is offline Learning Programmer
    Join Date
    Dec 2009
    Posts
    34
    Rep Power
    0

    Re: Cashflow\\ Any suggestions?

    Not an assignment.

    Just want to implement what I have learned so far in C#, while getting recommendations from you guys.
    Demodex is one of the parasitic face mites that occur on people
    These parasites are found in the hair, normally found in greater numbers around the cheeks and foreheadWatch out !!!

  5. #4
    PGP_Protector's Avatar
    PGP_Protector is offline Programming Professional
    Join Date
    Jun 2009
    Posts
    253
    Rep Power
    11

    Re: Cashflow\\ Any suggestions?

    Ok, not a prob then.
    It seems like we're getting lots of homework help questions recently.

    OK, What have you got so far ?
    Do you have a Database Format (Are you going to use a full blown Database or something like SQLIte ?)

  6. #5
    Demodex is offline Learning Programmer
    Join Date
    Dec 2009
    Posts
    34
    Rep Power
    0

    Re: Cashflow\\ Any suggestions?

    Well I think the biggest thing I recognize as a problem is the database.
    I never worked with databases before in C#.

    Is creating an SQL database will be the smartest thing to do?

    This is, above all my biggest challenge.

    **
    By the way, for the record - I finished school long ago
    Demodex is one of the parasitic face mites that occur on people
    These parasites are found in the hair, normally found in greater numbers around the cheeks and foreheadWatch out !!!

  7. #6
    QuackWare is offline Learning Programmer
    Join Date
    Jan 2010
    Posts
    95
    Rep Power
    8

    Re: Cashflow\\ Any suggestions?

    You can use a database like SQL or mySQL which there are a lot of tutorials for. If you want to keep it simple you can just use a simple text file for your database and use StreamWriter to "save" the data to it.

  8. #7
    PGP_Protector's Avatar
    PGP_Protector is offline Programming Professional
    Join Date
    Jun 2009
    Posts
    253
    Rep Power
    11

    Re: Cashflow\\ Any suggestions?

    Quote Originally Posted by Demodex View Post
    Well I think the biggest thing I recognize as a problem is the database.
    I never worked with databases before in C#.

    Is creating an SQL database will be the smartest thing to do?

    This is, above all my biggest challenge.

    **
    By the way, for the record - I finished school long ago
    A Database works well if you're going to be accessing the data from multiple locations, and you want them to all access the same data.

    A File works best if you only want the program to access the one copy of data. So if you install the program on a second site, then that copy will have its own version of the data.

    If it's the second (One copy of data) I'd go with either SQLite or a custom XML Document.

    Both are quite easy to use in C#
    Example Code (Not including the Includes )
    Code:
            public static bool LoadData(string LoadFile)
            {
                bool ValidConfigurationLoaded = false;
                try
                {
                    SQLConnect = new SQLiteConnection();
                    SQLConnect.ConnectionString = "Data Source = " + LoadFile;
                    SQLConnect.Open();
                    SQL_Command = SQLConnect.CreateCommand();
                    #region Get Settings
                    SQL_Command.CommandText = "SELECT * FROM 'settings'";
                    SQLReader = SQL_Command.ExecuteReader();
                    while (SQLReader.Read())
                    {
                        switch (SQLReader.GetInt32(0))
                        {
    
                            case 1:
                                Global.Data1 = SQLReader.GetInt32(2);
                                break;
                            case 2:
                                Global.Data2 = SQLReader.GetInt32(2);
                                break;
                            case 3:
                                Global.Data3 = SQLReader.GetInt32(2);
                                break;
                        }
    
                    }
                    SQLReader.Close();
                    #endregion
    
    
                    #region Get Magnet Calibraion Data
                    SQL_Command.CommandText = "SELECT * FROM 'buffers'";
                    SQLReader = SQL_Command.ExecuteReader();
                    int BufferIndex = 0;
                    while (SQLReader.Read())
                    {
                        MagCalIndex = SQLReader.GetInt32(0);
                        Global.Buffers[1, 1, BufferIndex] = Convert.ToDouble(SQLReader.GetValue(2));
                        Global.Buffers[1, 2, BufferIndex] = Convert.ToDouble(SQLReader.GetValue(3));
                        Global.Buffers[1, 3, BufferIndex] = Convert.ToDouble(SQLReader.GetValue(4));
                        Global.Buffers[2, 1, BufferIndex] = Convert.ToDouble(SQLReader.GetValue(5));
                        Global.Buffers[2, 2, BufferIndex] = Convert.ToDouble(SQLReader.GetValue(6));
                        Global.Buffers[2, 3, BufferIndex] = Convert.ToDouble(SQLReader.GetValue(7));
                    }
                    SQLReader.Close();
                    #endregion
    
    
                    ValidConfigurationLoaded = true;
                }
                catch (Exception e)
                {
                    // Database read had An Error
                    MessageBox.Show(e.Message);
                    ValidConfigurationLoaded = false;
                }
                return ValidConfigurationLoaded;
            }
    This Loads a SQLite File into the predefined arrays (Defined in Globals.cs)
    This is only a sniplet of code, and won't work by itself, but is taken from a working program I'm using that loads a few thousand data points.

  9. #8
    Demodex is offline Learning Programmer
    Join Date
    Dec 2009
    Posts
    34
    Rep Power
    0

    Re: Cashflow\\ Any suggestions?

    OK here is what I have so far...

    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace Cashflow
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            System.Data.SqlClient.SqlConnection con;
            DataSet ds1;
            System.Data.SqlClient.SqlDataAdapter da;
    
            int MaxRows = 0;
            int inc = 0;
    
            private void Form1_Load(object sender, EventArgs e)
            {
                con = new System.Data.SqlClient.SqlConnection();
                ds1 = new DataSet();
    
                con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\DB.mdf;Integrated Security=True;User Instance=True";
    
                string sql = "SELECT* From DB";
                da = new System.Data.SqlClient.SqlDataAdapter(sql, con);
            }
    
            private void NavigateRecords()
        {
            DataRow dRow = ds1.Tables["Deals"].Rows[inc];
            purchaselbl.Text = dRow.ItemArray.GetValue(1).ToString();
            costlbl.Text = dRow.ItemArray.GetValue(2).ToString();
            methodlbl.Text = dRow.ItemArray.GetValue(3).ToString();
        }
    
            private void dbconnectbtn_Click(object sender, EventArgs e)
            {
                if (con.State == ConnectionState.Closed)
                {
                    con.Open();
                    MessageBox.Show("Connected to Database");
                    da.Fill(ds1, "Deals");
                    connectstatuslbl.Text = "Connected";
                    dbconnectbtn.Text = "Disconnect from Database";
                    connectstatuslbl.ForeColor = Color.Green;
                    NavigateRecords();
                    MaxRows = ds1.Tables["Deals"].Rows.Count;
                }
                else
                {
                    con.Close();
                    MessageBox.Show("Disconnected from Database");
                    connectstatuslbl.Text = ("Disconnected");
                    dbconnectbtn.Text = "Connect to Database";
                    connectstatuslbl.ForeColor = Color.Red;
                }
            }
    
            private void nextrecordbtn_Click(object sender, EventArgs e)
            {
                if (inc != MaxRows -1)
                {
                    inc++;
                    NavigateRecords();
                }
                else
                {
                    MessageBox.Show("No more records");
                }
            }
    
            private void prevrecordbtn_Click(object sender, EventArgs e)
            {
                if (inc > 0)
                {
                    inc--;
                    NavigateRecords();
                }
                else
                {
                    MessageBox.Show("No more records");
                }
            }
    
            private void lastrecordbtn_Click(object sender, EventArgs e)
            {
                if (inc != MaxRows - 1)
                {
                    inc = MaxRows - 1;
                    NavigateRecords();
                }
                else
                {
                    MessageBox.Show("This is the last record");
                }
            }
            private void firstrecordbtn_Click_1(object sender, EventArgs e)
            {
                inc = 0;
                NavigateRecords();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    DataRow dRow = ds1.Tables["Deals"].NewRow();
    
                    dRow[1] = newpurchasetb.Text;
                    dRow[2] = newsumtb.Text;
    
                    if (newcashrb.Checked)
                    {
                        dRow[3] = newcashrb.Text;
                    }
                    else if (newcreditrb.Checked)
                    {
                        dRow[3] = newcreditrb.Text;
                    }
                    else
                    {
                        MessageBox.Show("You must select a payment method", "Error");
                    }
    
                    ds1.Tables["Deals"].Rows.Add(dRow);
    
                    MaxRows = MaxRows + 1;
                    inc = MaxRows - 1;
                }
                catch
                {
                    MessageBox.Show("You must fill the expense details", "Error");
                }
            }
        }
    }
    Would appreciate any help
    Demodex is one of the parasitic face mites that occur on people
    These parasites are found in the hair, normally found in greater numbers around the cheeks and foreheadWatch out !!!

  10. #9
    Demodex is offline Learning Programmer
    Join Date
    Dec 2009
    Posts
    34
    Rep Power
    0

    Re: Cashflow\\ Any suggestions?

    Guys It is extremely important for me to continue with this but I am now stuck...

    I Added "Insurance" to the "Add & Update Records" buttons, from evil users point of view (evil inputs, integers instead of string and opposite, and blank text boxes. This is the reason for the two huge "if" parts. They are commented to help navigate through the code.

    I have a new problem now though.
    After I add a record, and then try to update it I get the following exception:
    Concurrency violation:the UpdateCommand affected 0 of the expected 1 records.

    Here is the code:

    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace Cashflow
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            System.Data.SqlClient.SqlConnection con;
            DataSet ds1;
            System.Data.SqlClient.SqlDataAdapter da;
    
            int MaxRows = 0;
            int inc = 0;
    
            private void Form1_Load(object sender, EventArgs e)
            {
                con = new System.Data.SqlClient.SqlConnection();
                ds1 = new DataSet();
    
                con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\DB.mdf;Integrated Security=True;User Instance=True";
    
                string sql = "SELECT* From DB";
                da = new System.Data.SqlClient.SqlDataAdapter(sql, con);
            }
    
            private void NavigateRecords()
            {
                DataRow dRow = ds1.Tables["Deals"].Rows[inc];
                purchaselbl.Text = dRow.ItemArray.GetValue(1).ToString();
                costlbl.Text = dRow.ItemArray.GetValue(2).ToString();
                methodlbl.Text = dRow.ItemArray.GetValue(3).ToString();
            }
    
            private void dbconnectbtn_Click(object sender, EventArgs e)
            {
                if (con.State == ConnectionState.Closed)
                {
                    con.Open();
                    MessageBox.Show("Connected to Database");
                    da.Fill(ds1, "Deals");
                    connectstatuslbl.Text = "Connected";
                    dbconnectbtn.Text = "Disconnect from Database";
                    connectstatuslbl.ForeColor = Color.Green;
                    NavigateRecords();
                    MaxRows = ds1.Tables["Deals"].Rows.Count;
                }
                else
                {
                    con.Close();
                    MessageBox.Show("Disconnected from Database");
                    connectstatuslbl.Text = ("Disconnected");
                    dbconnectbtn.Text = "Connect to Database";
                    connectstatuslbl.ForeColor = Color.Red;
                }
            }
    
            private void nextrecordbtn_Click(object sender, EventArgs e)
            {
                if (inc != MaxRows - 1)
                {
                    inc++;
                    NavigateRecords();
                }
                else
                {
                    MessageBox.Show("No more records");
                }
            }
    
            private void prevrecordbtn_Click(object sender, EventArgs e)
            {
                if (inc > 0)
                {
                    inc--;
                    NavigateRecords();
                }
                else
                {
                    MessageBox.Show("No more records");
                }
            }
    
            private void lastrecordbtn_Click(object sender, EventArgs e)
            {
                if (inc != MaxRows - 1)
                {
                    inc = MaxRows - 1;
                    NavigateRecords();
                }
                else
                {
                    MessageBox.Show("This is the last record");
                }
            }
            private void firstrecordbtn_Click_1(object sender, EventArgs e)
            {
                inc = 0;
                NavigateRecords();
            }
    
            private void createbtn_Click(object sender, EventArgs e)
            {
                System.Data.SqlClient.SqlCommandBuilder cb;
                cb = new System.Data.SqlClient.SqlCommandBuilder(da);
                DataRow dRow = ds1.Tables["Deals"].NewRow();
    
    
                //1.this "if" is for all fields blank -> Error //
                if (newpurchasetb.Text.Length == 0 && newsumtb.Text.Length == 0 && newcashrb.Checked == false && newcreditrb.Checked == false)
                {
                    MessageBox.Show("Please enter purchase and sum fields, and select a payment method", "Error");
                }
                //2.this "if" is for all fields blank but "Credit" is checked -> Error //
                else if (newpurchasetb.Text.Length == 0 && newsumtb.Text.Length == 0 && newcreditrb.Checked)
                {
                    MessageBox.Show("Please enter purchase and sum details", "Error");
                }
                //3.this "if" is for all fields blank but "Cash" is checked -> Error //
                else if (newpurchasetb.Text.Length == 0 && newsumtb.Text.Length == 0 && newcashrb.Checked)
                {
                    MessageBox.Show("Please enter purchase and sum details", "Error");
                }
                //4.this "if" is for "Purchase" field not empty, but rest of fields are empty -> Error //
                else if (newpurchasetb.Text.Length > 0 && newsumtb.Text.Length == 0 && newcashrb.Checked == false && newcreditrb.Checked == false)
                {
                    MessageBox.Show("Please enter sum details and select a payment method", "Error");
                }
                //5.this "if" is for "Sum" field not empty, but rest of fields are empty -> Error //
                else if (newpurchasetb.Text.Length == 0 && newsumtb.Text.Length > 0 && newcashrb.Checked == false && newcreditrb.Checked == false)
                {
                    MessageBox.Show("Please enter purchase details and select a payment method", "Error");
                }
                //6.this "if" is for "Sum" field not empty and "Cash" is checked, but "Purchase" is empty -> Error //
                else if (newpurchasetb.Text.Length == 0 && newsumtb.Text.Length > 0 && newcashrb.Checked)
                {
                    MessageBox.Show("Please enter purchase details", "Error");
                }
                //7.this "if" is for "Sum" field not empty and "Credit" is checked, but "Purchase" is empty -> Error //
                else if (newpurchasetb.Text.Length == 0 && newsumtb.Text.Length > 0 && newcreditrb.Checked)
                {
                    MessageBox.Show("Please enter purchase details", "Error");
                }
                //8.this "if" is for "Purchase" field not empty and "Credit" is checked, but "Sum" is empty -> Error //
                else if (newpurchasetb.Text.Length > 0 && newsumtb.Text.Length == 0 && newcreditrb.Checked)
                {
                    MessageBox.Show("Please enter sum details", "Error");
                }
                //9.this "if" is for "Purchase" field not empty and "Cash" is checked, but "Sum" is empty -> Error //
                else if (newpurchasetb.Text.Length > 0 && newsumtb.Text.Length == 0 && newcashrb.Checked)
                {
                    MessageBox.Show("Please enter sum details", "Error");
                }
                //10.this "if" is for "Purchase" and "Sum" fiels not empty, but no payment method is checked -> Error//
                else if (newpurchasetb.Text.Length > 0 && newsumtb.Text.Length > 0 && newcashrb.Checked == false && newcreditrb.Checked == false)
                {
                    MessageBox.Show("Please select a payment method", "Error");
                }
                //11.this "if" is for "Purchase" and "Sum" fiels not empty, and "Cash" is selected -> Success//
                else if (newpurchasetb.Text.Length > 0 && newsumtb.Text.Length > 0 && newcashrb.Checked)
                {
                    dRow[1] = newpurchasetb.Text;
                    dRow[2] = newsumtb.Text;
                    dRow[3] = newcashrb.Text;
                    ds1.Tables["Deals"].Rows.Add(dRow);
                    MaxRows = MaxRows + 1;
                    inc = MaxRows - 1;
                    da.Update(ds1, "Deals");
                    MessageBox.Show("The data you enterred has been successfully added to the database", "Data added");
                }
                //12.this "if" is for "Purchase" and "Sum" fiels not empty, and "Credit" is selected -> Success//
                else if (newpurchasetb.Text.Length > 0 && newsumtb.Text.Length > 0 && newcreditrb.Checked)
                {
                    dRow[1] = newpurchasetb.Text;
                    dRow[2] = newsumtb.Text;
                    dRow[3] = newcreditrb.Text;
                    ds1.Tables["Deals"].Rows.Add(dRow);
                    MaxRows = MaxRows + 1;
                    inc = MaxRows - 1;
                    da.Update(ds1, "Deals");
                    MessageBox.Show("The data you enterred has been successfully added to the database", "Data added");
                }
            }
    
            private void updatebtn_Click(object sender, EventArgs e)
            {
                System.Data.SqlClient.SqlCommandBuilder cb;
                cb = new System.Data.SqlClient.SqlCommandBuilder(da);
                System.Data.DataRow dRow2 = ds1.Tables["Deals"].Rows[inc];
    
    
                //1.this "if" is for all fields blank -> Error //
                if (newpurchasetb.Text.Length == 0 && newsumtb.Text.Length == 0 && newcashrb.Checked == false && newcreditrb.Checked == false)
                {
                    MessageBox.Show("Please enter purchase and sum fields, and select a payment method", "Error");
                }
                //2.this "if" is for all fields blank but "Credit" is checked -> Error //
                else if (newpurchasetb.Text.Length == 0 && newsumtb.Text.Length == 0 && newcreditrb.Checked)
                {
                    MessageBox.Show("Please enter purchase and sum details", "Error");
                }
                //3.this "if" is for all fields blank but "Cash" is checked -> Error //
                else if (newpurchasetb.Text.Length == 0 && newsumtb.Text.Length == 0 && newcashrb.Checked)
                {
                    MessageBox.Show("Please enter purchase and sum details", "Error");
                }
                //4.this "if" is for "Purchase" field not empty, but rest of fields are empty -> Error //
                else if (newpurchasetb.Text.Length > 0 && newsumtb.Text.Length == 0 && newcashrb.Checked == false && newcreditrb.Checked == false)
                {
                    MessageBox.Show("Please enter sum details and select a payment method", "Error");
                }
                //5.this "if" is for "Sum" field not empty, but rest of fields are empty -> Error //
                else if (newpurchasetb.Text.Length == 0 && newsumtb.Text.Length > 0 && newcashrb.Checked == false && newcreditrb.Checked == false)
                {
                    MessageBox.Show("Please enter purchase details and select a payment method", "Error");
                }
                //6.this "if" is for "Sum" field not empty and "Cash" is checked, but "Purchase" is empty -> Error //
                else if (newpurchasetb.Text.Length == 0 && newsumtb.Text.Length > 0 && newcashrb.Checked)
                {
                    MessageBox.Show("Please enter purchase details", "Error");
                }
                //7.this "if" is for "Sum" field not empty and "Credit" is checked, but "Purchase" is empty -> Error //
                else if (newpurchasetb.Text.Length == 0 && newsumtb.Text.Length > 0 && newcreditrb.Checked)
                {
                    MessageBox.Show("Please enter purchase details", "Error");
                }
                //8.this "if" is for "Purchase" field not empty and "Credit" is checked, but "Sum" is empty -> Error //
                else if (newpurchasetb.Text.Length > 0 && newsumtb.Text.Length == 0  && newcreditrb.Checked)
                {
                    MessageBox.Show("Please enter sum details", "Error");
                }
                //9.this "if" is for "Purchase" field not empty and "Cash" is checked, but "Sum" is empty -> Error //
                else if (newpurchasetb.Text.Length > 0 && newsumtb.Text.Length == 0 && newcashrb.Checked)
                {
                    MessageBox.Show("Please enter sum details", "Error");
                }
                //10.this "if" is for "Purchase" and "Sum" fiels not empty, but no payment method is checked -> Error//
                else if (newpurchasetb.Text.Length > 0 && newsumtb.Text.Length > 0 && newcashrb.Checked == false && newcreditrb.Checked == false)
                {
                    MessageBox.Show("Please select a payment method", "Error");
                }
                //11.this "if" is for "Purchase" and "Sum" fiels not empty, and "Cash" is selected -> Success//
                else if (newpurchasetb.Text.Length > 0 && newsumtb.Text.Length > 0 && newcashrb.Checked)
                {
                    dRow2[1] = newpurchasetb.Text;
                    dRow2[2] = newsumtb.Text;
                    dRow2[3] = newcashrb.Text;
                    da.Update(ds1, "Deals");
                    MessageBox.Show("The data you edited has been successfully updated in the database", "Data updated");
                }
                //12.this "if" is for "Purchase" and "Sum" fiels not empty, and "Credit" is selected -> Success//
                else if (newpurchasetb.Text.Length > 0 && newsumtb.Text.Length > 0 && newcreditrb.Checked)
                {
                    dRow2[1] = newpurchasetb.Text;
                    dRow2[2] = newsumtb.Text;
                    dRow2[3] = newcreditrb.Text;
                    da.Update(ds1, "Deals");
                    MessageBox.Show("The data you edited has been successfully updated in the database", "Data updated");
                }
            }
            private void newsumtb_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), "\\d+"))
                    e.Handled = true;
            }
        }
    }
    Demodex is one of the parasitic face mites that occur on people
    These parasites are found in the hair, normally found in greater numbers around the cheeks and foreheadWatch out !!!

  11. #10
    Demodex is offline Learning Programmer
    Join Date
    Dec 2009
    Posts
    34
    Rep Power
    0

    Re: Cashflow\\ Any suggestions?

    deleted
    Last edited by Demodex; 01-28-2010 at 08:34 AM. Reason: browser bug, pls delete this
    Demodex is one of the parasitic face mites that occur on people
    These parasites are found in the hair, normally found in greater numbers around the cheeks and foreheadWatch out !!!

Closed Thread
Page 1 of 2 12 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Any Suggestions?
    By AntLaTech in forum C and C++
    Replies: 3
    Last Post: 11-18-2010, 08:24 PM
  2. Two Suggestions
    By Deadlock in forum The Lounge
    Replies: 2
    Last Post: 03-28-2010, 06:18 AM
  3. Suggestions please
    By reniery in forum General Programming
    Replies: 5
    Last Post: 10-29-2008, 02:28 PM

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts