Laden...

IO_Admin

Erstellt von debo vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.567 Views
debo Themenstarter:in
4 Beiträge seit 2007
vor 16 Jahren
IO_Admin

Hi!
Ich wollte mich erstmal vorstellen und kurz was dazu sagen wie ich zu C# gekommen bin. Mein Name ist Dennis bzw. mein Nick debo. Ich hoffe hier im Forum werde ich ein paar Sachen beitragen können. So jetzt zu C#...
Ich habe 3 Jahre Delphi auf der Berufsschule teilweise gelernt und 1 Jahr C++ (ITA). Erst letztes Jahr während eines IT-Projektes im Studium bin ich zu C# gekommen. Ich fand die Umgebung klasse. Die Möglichkeiten Web-Andwendungen zu erstellen und gleichzeitig die Funktionen auf dem lokalen Rechner verwenden zu können fand ich super. Deswegen wollte ich weiter in C# eintauchen 😁

So jetzt zu meinem Projekt, welches noch in den Kinderschuhen steckt.

Ich habe mir schon oft Gedanken drüber gemacht, wo mein ganzes Geld wohl verschwindet bzw. wo ich es ausgebe. Deswegen habe ich mir überlegt, dass ich mir sozusagen ein Buchführungsprogramm schreibe.
Datenbankimplementierung->Visualisierung der Daten.
Zur Zeit habe ich nur das Grundgerüst fertig gestellt. Daten auslesen, löschen, anzeigen.

Ich habe MYSQL gewählt, da ich es schon auf meinem Home-Webserver laufen habe.

Was sollte das Programm (in naher Zukunft 😉 ) können:
--> Oberfläche visuel anschaulicher machen. Menüstrip, Iconbar, schöne Grafiken,...
--> Config-Datei für die Datenbank
--> Datenbanktabelle erstellen lassen
--> Monatsübersichten drucken bzw. in Textdateien speichern
--> Diagramme einfügen (Kreisdiagramm/Balkendiagramm) zur Übersicht
--> ....

Derzeitige MySQL Syntax:
CREATE TABLE io_table (
ID_IO int(4) NOT NULL auto_increment,
date varchar(10) character set latin1 collate latin1_german1_ci NOT NULL,
type_of_IO text character set latin1 collate latin1_german1_ci NOT NULL,
description text character set latin1 collate latin1_german1_ci NOT NULL,
value double NOT NULL,
PRIMARY KEY (ID_IO)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;

Ich bin für alle Kritiken offen, da ich gerne dazu lerne und schliesslich kann eine Kritik nie schaden. Für Tipps bin ich ebenfalls offen.

Hier ein Screenshot zu meiner derzeitigen Oberfläche:

debo Themenstarter:in
4 Beiträge seit 2007
vor 16 Jahren

und zu guter letzt der derzeitige Quelltext:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.Odbc;

//-------------------------------------------------------------------------------------------------
// debo 2007
// "IO_Admin" 
//-------------------------------------------------------------------------------------------------

namespace IO_Admin
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        //-----------------------------------------------------------------------------------------
        // INITIALISIERUNGEN: Datenbankinformationen und Variablenfestlegung
        //-----------------------------------------------------------------------------------------
        string MyConString = "DRIVER={MySQL ODBC 3.51 Driver};" +
            "SERVER=localhost;" +       // <-- Server
            "DATABASE=io_database;" +   // <-- Datenbank
            "UID=XXXXX;" +               // <-- Login
            "PASSWORD=XXXXX;" +     // <-- Password
            "OPTION=3";                 // <-- MySQL-Optionen
        OdbcConnection MyConnection;
        OdbcCommand MyCommend = new OdbcCommand();
        OdbcDataReader MyDataReader;
        //-----------------------------------------------------------------------------------------
        // FUNKTION: Verbinden und Beenden von MySQL
        //-----------------------------------------------------------------------------------------
        private void MySQL_verbinden()
        {
            try
            {
                MyConnection = new OdbcConnection(MyConString);
                MyConnection.Open();
                MyCommend.Connection = MyConnection;
            }
            catch (OdbcException MyOdbcException) // <-- Fängt alle ODBCExceptions ab
            {
                for (int i = 0; i < MyOdbcException.Errors.Count; i++)
                {
                    MessageBox.Show("ERROR #" + i + "\n" +
                            "Message: " +
                            MyOdbcException.Errors[i].Message + "\n" +
                            "Native: " +
                            MyOdbcException.Errors[i].NativeError.ToString() + "\n" +
                            "Source: " +
                            MyOdbcException.Errors[i].Source + "\n" +
                            "SQL: " +
                            MyOdbcException.Errors[i].SQLState + "\n");

                }
            }
        }
        private void MySQL_beenden()
        {
            MyCommend.Cancel();
            MyConnection.Close();
        }
        //-----------------------------------------------------------------------------------------
        // FUNKTION: datagridview Daten auslesen und in gbox_input_delete einfügen
        //-----------------------------------------------------------------------------------------
        private void DatenMakierung()
        {
            if (dataGridView.CurrentRow != null)
            {
                int row = Convert.ToInt16(dataGridView.CurrentRow.Index.ToString());
                string[] Daten = new string[4];
                for (int i = 0; i < 4; i++)
                {
                    Daten[i] = dataGridView.Rows[row].Cells[i].Value.ToString();
                }
                tbox_date_io.Text = Daten[0];
                cbox_type_io.SelectedIndex = cbox_type_io.FindString(Daten[1], -1); ;
                tbox_descr_io.Text = Daten[2];
                tbox_value_io.Text = Daten[3];
            }
        }
        //-----------------------------------------------------------------------------------------
        // FUNKTION: Daten anzeigen / suchen
        //-----------------------------------------------------------------------------------------
        private void DatenFinden()
        {
            dataGridView.Rows.Clear();

            string  Monat = "%";
            string  Beschreibung = tbox_descr_show.Text, 
                    Betrag = (tbox_value_show.Text).Replace(',', '.');

            if (Beschreibung == "") Beschreibung = "%";
            if (Betrag == "")       Betrag = "%";
            if (cbox_month_show.Text != "")
                if (cbox_month_show.SelectedIndex < 10)
                    Monat = "0" + cbox_month_show.SelectedIndex;

            if (!((cbox_input.Checked == false) && (cbox_output.Checked == false)))
            {
                string Abfrage = "SELECT * FROM io_table ";
                if ((cbox_input.Checked == true) && (cbox_output.Checked == false))
                    Abfrage = Abfrage + "WHERE type_of_IO='Einnahme'";
                if ((cbox_input.Checked == false) && (cbox_output.Checked == true))
                    Abfrage = Abfrage + "WHERE type_of_IO='Ausgabe'";
                if ((cbox_input.Checked == true) && (cbox_output.Checked == true))
                    Abfrage = Abfrage + "WHERE type_of_IO LIKE '%' ";
                MyCommend.CommandText = Abfrage + "AND date LIKE '%." + Monat + 
                                        ".%' AND description LIKE '" + Beschreibung + 
                                        "' AND value LIKE '" + Betrag + "' ORDER BY date";
                MyDataReader = MyCommend.ExecuteReader();
                while (MyDataReader.Read())
                {
                    dataGridView.Rows.Add(MyDataReader.GetString(1), MyDataReader.GetString(2), 
                        MyDataReader.GetString(3), MyDataReader.GetValue(4));
                }
                MyDataReader.Close();
            }
        }
        //-----------------------------------------------------------------------------------------
        // FUNKTION: Daten einfügen / löschen
        //-----------------------------------------------------------------------------------------
        private void DatenVerarbeiten()
        {
            if ((tbox_date_io.Text != "") && (tbox_descr_io.Text != "") &&
                (tbox_value_io.Text != "") && (cbox_type_io.Text != ""))
            {
                string  Datum = tbox_date_io.Text, Typ = cbox_type_io.Text,
                        Beschreibung = tbox_descr_io.Text,
                        Betrag = (tbox_value_io.Text).Replace(',', '.');

                MyCommend.CommandText = "SELECT * FROM io_table WHERE date='" + Datum +
                    "' AND type_of_IO='" + Typ + "' AND description='" + Beschreibung +
                    "' AND value='" + Betrag + "'";

                MyDataReader = MyCommend.ExecuteReader();
                MyDataReader.Read();

                if (MyDataReader.HasRows == false)
                {
                    MyDataReader.Close();
                    MyCommend.CommandText = "INSERT INTO io_table(date,type_of_IO,description,value) VALUES('" 
                        + Datum + "','" + Typ + "','" + Beschreibung + "'," + Betrag + ")";
                    MyCommend.ExecuteNonQuery();
                }
                else
                {
                    string id = MyDataReader.GetString(0);
                    MyDataReader.Close();
                    MyCommend.CommandText = "DELETE FROM io_table WHERE ID_IO='" + id + "'";
                    MyCommend.ExecuteNonQuery();
                }
                MyDataReader.Close();
            }
        }
        //-----------------------------------------------------------------------------------------
        // FUNKTION: Textboxen und Checkbox reseten für Suchabfrage
        //-----------------------------------------------------------------------------------------
        private void Gbox1Reset()
        {
            cbox_month_show.Text = "";
            tbox_descr_show.Text = "";
            tbox_value_show.Text = "";
        }
        //-----------------------------------------------------------------------------------------
        // FORMEIGENSCHAFTEN: Funktionen zuweisen, Verhalten bearbeiten...
        //-----------------------------------------------------------------------------------------
        private void MainForm_Load(object sender, EventArgs e)
        {
            MySQL_verbinden();
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            MySQL_beenden();
        }

        private void btn_show_Click(object sender, EventArgs e)
        {
            DatenFinden();
        }

        private void btn_input_Click(object sender, EventArgs e)
        {
            DatenVerarbeiten();
            Gbox1Reset();
            DatenFinden();
        }

        private void btn_delete_Click(object sender, EventArgs e)
        {
            DatenVerarbeiten();
            Gbox1Reset();
            DatenFinden();
        }

        private void dataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            DatenMakierung();
        }
    }
}
debo Themenstarter:in
4 Beiträge seit 2007
vor 16 Jahren

und die Projekt-Dateien:

2.223 Beiträge seit 2005
vor 16 Jahren

Hallo debo und Herzlich Willkommen,

ein paar wenige Anmerkungen von mir

für die Verbindungen zur mysql DB empfehle ich auch einen ADO .Net mysql Provider
Download unter mysql.com unter Driver

und das hier

"INSERT INTO io_table(date,type_of_IO,description,value) VALUES('"
                        + Datum + "','" + Typ + "','" + Beschreibung + "'," + Betrag + ")";

SQL injection

bitte auf keinen fall ungeprüft (besser mit parameter)

mfg

245 Beiträge seit 2005
vor 16 Jahren

Hallo Debo!

Erstmal herzlich willkommen hier!

Nachdem ich selbst bereits so ein Programm erstellt habe, füge ich mal einen Screenshot von diesem ein. Ist zwar im Prinzip auch nicht viel komplexer aber vielleicht bringt es dich ja auf weitere Ideen...

Mein erstes Programm in die Richtung hab ich noch als Konsolen-Anwendung geschrieben, danach wurde das ganze dann in Java realisiert (da ich dort die 1. Erfahrungen mit grafischen Oberflächen gemacht habe) und später dann letztendlich in C#.

Auch bei mir setzt das ganze auf einer MySql-DB auf. Eine solche läuft bei mir zu Hause und auf meinem Webspace, wobei ich prinzipiell auf jener am Webspace arbeite (ist einfach schneller, wenn ich das Programm zB. aus der Arbeit ausführe) und die Zuhause automatisch täglich aktualisiert wird (im Prinzip nur als Backup).

Zusätzlich zur Finanz-Verwaltung hab ich noch eine kleine Tankstatistik erstellt, was auf dauer relativ aufschlussreich ist, solange man sie immer aktuell hält.

Mit einer neuen Version hab ich auch bereits begonnen, komme aber Momentan einfach nicht dazu, diese wirklich zu realisieren. Geplant sind hier auch noch grafische Darstellungen (Diagramme usw.), eine erweiterte Such-Funktion usw. usf.

So long, mfg

H
182 Beiträge seit 2006
vor 16 Jahren

Hallo suamikim,

sieht gut aus Dein Programm! Gibts dazu auch den passenden Code oder eine Exe? Mit Tankstatistik bräuchte ich auch mal^^

Gruß
HyperteX

"In der Informatik geht es genauso wenig um Computer wie in der Astonomie um Teleskope."
Edsger Dijkstra

245 Beiträge seit 2005
vor 16 Jahren

Hm, zur Veröffentlichung habe ich das Programm eigentlich nicht vorgesehen. Das ganze hat mehrere Gründe:

  • Ich hab bisher noch keine Möglichkeit eingebaut, die Datenbankstruktur automatisch erstellen zu lassen. Dh. ich müsste auch MySql-Skripts mitgeben (was eigentlich gar kein Problem darstellt) und der Benutzer müsste sich selbst um das anlegen der Datenbank kümmern.

  • Es gibt einige kleine Bugs, die mich persönlich momentan nicht stören, welche ich vor einer Veröffentlichung aber gerne beheben würde (wozu mir aber im Moment die Motivation und die Zeit fehlt).

  • Das Verhalten des Programms hab ich natürlich sehr speziell auf meine Wünsche und Anforderungen abgestimmt, weshalb ich glaube, dass es tlw. für Außenstehende etwas undurchschaubar ist.

Der wichtigste Punkt (warum ich auf keinen Fall den Source hergeben möchte):

  • Das ganze Programm ist über die Jahre hinweg immer wieder mal ein wenig erweitert worden. In dieser Zeit hab ich mich wohl vom Programmier-Anfänger zum halbwegs erfahrenen Programmierer entwickelt. Nachdem ich das Programm aber nie ganz "remastered" habe ist der Code natürlich unanschaulich, weil eine bunte Mischung aus grausamen Anfänger-Hick-Hack bis zu (so denke ich) halbwegs brauchbarem Code, welcher aber (aufgrund der fehlenden Struktur) tlw. auch recht wild konstruiert ist.
    Dies ist auch der Grund, warum ich bei der neuen Version ganz von vorne begonnen habe. Die gewünschten Erweiterungen hätte ich auch in der jetzigen Version einbauen können, allerdings will ich das ganze mal halbwegs ordentlich durchstrukturiert haben...

Wie das Programm momentan ist, kann ich auch die Exe nicht einfach hergeben, weil das DB-Passwort unverschlüsselt im Quelltext steht (ist ja kein Problem, solange nur ich damit arbeite 😉) und von jedem Benutzer selbst angepasst werden müsste...

Sollte das Interesse wirklich groß sein, könnte ich mich vielleicht dazu durchringen, ein paar Änderungen vorzunehmen, mit welchen ich die Exe dann auch hergeben könnte (Pwd zB. aus verschlüsselter Datei lesen, Scripts erstellen, ...).

Wenn es wirklich nur um die Tankstatistik geht, kann ich dir nur sagen, dass diese doch ziemlich einfach selbst zu realisieren wäre...

mfg

H
182 Beiträge seit 2006
vor 16 Jahren

Ich bin auch noch net der Pro in C#^^ Wir haben doch alle mal klein angefangen 😉

Es geht mir vorallem darum, dass ich immer am bessten an anderen Programmen lernen kann und verschiedene Wege mir anschau um dann zu vergleichen. Ich wollte mir nämlich auch ne kleine Lösung für mich und meine kleine GbR erstellen (War grad beim Finanzamt......) und da wäre es einfach interessant was Eure Software unterstützt was ich vielleicht von vorn herein berücksichtigen kann. Gerade in Bezug auf Features und so.

Insofern wäre super nett, wenn Du Dein Code grad etwas modifizieren könntest. Aber wenn Du keine Zeit/Lust hast ist auch net schlimm!

Gruß

"In der Informatik geht es genauso wenig um Computer wie in der Astonomie um Teleskope."
Edsger Dijkstra

debo Themenstarter:in
4 Beiträge seit 2007
vor 16 Jahren

Vielen Dank suanikim!
Finde dein Programm super vom Aufbau her. Ich weiss auch nicht warum ich nicht den Kalender verwendet habe?! 🤔
Super Sache
Das Problem ist auch bei mir, dass ich nicht viel Zeit habe wegen Studium und privat Leben (Freundin ^^). Aber ich werde mal ein paar Änderungen vornehmen.

Danke nochmal

245 Beiträge seit 2005
vor 16 Jahren

Nachdem ich gerade ein paar kleine Änderungen vorgenommen habe, habe ich mich dazu entschlossen, dass Programm an HyperteX weiterzugeben (samt Source).

Sollte noch jemand ernsthaftes Interesse daran haben -> PN mit E-Mail-Adresse an mich.

Gleich vorweg: Der MySql-Server muss natürlich selbst eingerichtet werden und auch die DB-Struktur wird nicht automatisch vom Programm generiert. Ich schicke lediglich eine *.sql-Datei mit, mithilfe welcher der MySql-Administrator die DB-Struktur erstellen kann.

Getestet wird das Prog übrigens auf MySql 4.0.24 (Webspace) und 5.0.27 (localhost). Keine Ahnung, wie es sich mit neueren oder älteren Versionen verhält...

mfg