Jetzt nochmal neu:
Ich hab mich dazu entschlossen das Ganze hier nochmal neu zu schreiben.
Warum ich das mache? Naja, ich fand, dass das alles zu kompliziert für einige ist.
Also jetzt gehts los...
Ich wurde gefragt ob ich in der Lage bin eine Kassenoberfläche für ein bestehendes WaWi mit MS-SQL Datenbank zu programmieren.
Ich mit meiner großen Klappe hab natürlich "ja, das könnte ich hinbekommen" gesagt.
Auf was für Probleme ich dabei gestoßen bin und noch Stoße werde ich hier in einer Art Tagebuch schreiben.
Was bisher geschah... Di. 18.10.2011 - Di. 25.10.2011
Als erstes habe ich überlegt, welche Programmiersprache ich denn benutzen soll. In PHP mit einem Browser als Frontend wollte ich das nicht machen.
Wäre zwar für mich, der sich auf HTML, PHP, CSS und MySQL spezialisiert hat, die einfachste Lösung, aber das wollte ich dann doch nicht.
Mich reizen ja Herausforderungen. ;)
Also fiel meine Wahl auf Visual C# aus dem Visual Studio 2010 Express von Microsoft.
Schnell fand ich einen Sourcecode der auf eine MySQL Datenbank zugreifen konnte, aber ich sollte ja auf MS-SQL zugreifen.
Die erste Aufgabe bestand darin, den passenden Namespace für MS-SQL Datenbanken und die richtige Funktion zu finden um
eine Verbindung aufzubauen.
Das war dann aber doch einfacher als gedacht.
Beim Namespace....
Aus : using MySql.Data.MySqlClient;
Wird: using System.Data.SqlClient;
Der MySQL Connection-String:
private static string Database = "TestDaten";
private static string Server = "localhost";
private static string Password = "passwort";
private static string Username = "benutzer";
private static string constring = "Server=" + Server + ";"
+ "Database=" + Database + ";"
+ "Uid=" + Username + ";"
+ "Password=" + Password + ";";
public static MySqlConnection con = new MySqlConnection(constring);
MS-SQL ist da etwas länger:
private static string Database = "TestDaten;
private static string Server = "localhost\\instanz";
private static string Password = "passwort";
private static string Username = "benutzer";
private static string Trust = "yes";
private static string ConTime = "30";
private static string constring = "user id=" + Username + ";"
+ "password=" + Password + ";"
+ "server=" + Server + ";"
+ "Trusted_Connection=" + Trust + ";"
+ "Database=" + Database + ";"
+ "connection timeout=" + ConTime + ";";
public static SqlConnection con = new SqlConnection(constring);
Lesen geht dann so in MySQL:
MySqlCommand com = new MySqlCommand();
MySqlDataReader reader;
com.CommandText = "Select * from customers where customers_id='" + txtCustomerNo.Text + "'";
com.Connection = clsConnection.con;
reader = com.ExecuteReader();
und so in MS-SQL:
SqlCommand com = new SqlCommand();
SqlDataReader reader;
com.CommandText = "SELECT * FROM customers WHERE customers_id='" + txtCustomerNo.Text + "';";
com.Connection = clsSQL.con;
reader = com.ExecuteReader();
Also irgendwie fast das gleiche. :)
Da das Ganze ja nicht nur auf einem Rechner laufen soll sondern auf mehreren Kassen-PC´s ist es also nötig
die Daten editierbar im Programm zu machen.
Mein erster Gedanke: Die Konfiguration in eine .ini Datei schreiben und die Werte da rausholen.
Gesagt, getan... Aber irgendwie habe ich die Werte nicht in den Connection-String reinbekommen.
Naja, ich habe dann mal in einem großen Forum um Hilfe gebeten. Eine der Antworten war, dass ini Dateien OUT sind.
Und Projekteigenschaften IN sind.
Ööööhhhmmm... Was auch immer mir das sagen sollte...
Wie gut das es Tante Google gibt. :D
Ganz schnell habe ich die Infos gefunden die ich gesucht habe. Gleich getestet und siehe da.... Es geht.
Schnell war der vorhandene Quelltext für die SQL-Verbindung angepasst.
private static string Database = Properties.Settings.Default.dbBase;
private static string Server = Properties.Settings.Default.dbHost + "\\" + Properties.Settings.Default.dbInst;
private static string Password = Properties.Settings.Default.dbPass;
private static string Username = Properties.Settings.Default.dbUser;
private static string Trust = Properties.Settings.Default.dbTrust;
private static string ConTime = Properties.Settings.Default.dbTimeout;
So einfach und ich versuche 3 Std. die Daten aus der config.ini da reinzubekommen.... Thema erledigt.
Da ich ja mal schauen wollte ob die Verbindung auch funktioniert, habe ich die Kundenverwaltung erstellt.
Die Kunden werden in einem ListView angezeigt. Ein Doppelklick auf einen Kunden gibt die Editierfelder frei.
Ein Klick auf den Aktualisieren Button schreibt die geänderten Daten in die Datenbank und lässt das geänderte ListView
erscheinen.
Damit wäre das schnelle Ändern von Kundendaten erstellt.
Weiter gehts mit einer Funktion, die meinen Freunden auch wichtig ist: Beim Beenden der Kassensoftware soll die Datenbank
auf einen FTP-Server hochgeladen werden.
Auch hier werden die wichtigsen Konfigurationswerte in die Projekteigenschaften geschrieben. FTP-Server, Benutzer und Passwort
sind nicht die einzigen Werte die benötigt werden. Welche Datei soll genommen werden, in welchen Ordner auf dem FTP soll die Datei
geschrieben werden. Und ach ja... wie soll die Datei heissen?
Beim Beenden wird jetzt der FTP-Upload durchgeführt. Über das Datei Menü läss sich ein manuelles Anstoßen des Uploads durchführen.
Was auch für so eine Kassensoftware wichtig ist: Drucken !!!
Wäre echt blöd, wenn man bei jedem Ausdruck erst den passenden Drucker aussuchen müsste. Das dauert zu lange. Richtig?
Also müssen Standard-Drucker für einige Dinge definiert werden. Und was liegt da näher als... na was wohl?
Projekteigenschaften Konfiguration !!!
Google hat mich auch da wieder zu den richtigen Informationen geleitet. In einem neuen Formular werden per ComboBox die
Einstellungen für 2 unterschiedliche Rechnungsdrucker, Bondrucker, pdfDrucker und FAX-Drucker eingestellt.
Ohhh Gott... als ich soweit alles fertig hatte, fiel mir auf, dass die Passwörter anicht unbedingt im Klartext gespeichert werden sollten.
Ich hab nach "C# String Encryption" bei Google gesucht und das passende gefunden. Eingebaut, geht.
Das war die Zusammenfassung nachdem ich das Ganze jetzt zum 3. Mal soweit fertig gemacht habe. Übung macht den Meister. ;)
26.10.2011:
Mir kam heute so der Gedanke, dass ja nicht jeder der das Programm nutzt (bzw. von jeder Kasse aus) die Datenbank gesichert werden soll.
Kurzerhand habe ich die FTP-Backup Funktion ausschaltbar gemacht. Das war alles für heute.
27.10.2011 - 30.10.2011:
Weiter gehts...
In den letzten Tagen habe ich etwas mehr als gedacht geschafft:
- komplettes Backup der Datenbank
- FTP-Upload auf Knopfdruck
- Kassenoberfläche
- Kunden in die Rechnungsempfänger Box
- Artikelsuche über Artikelnummer und EAN
- Artikelanzahl
- Einfügen der Werte in ein DataGridView
- Anzeige der Anzahl an Artikeln
- Errechnen der Zwischensumme
- Bim Klick auf Bondruck wird ein PrintPreview erzeugt
ToDo:
- Nach Direktdruck auf Bondrucker eine Rechnung in DB erstellen die als erstellt und bezahlt makiert ist
- Bei Rechnungsdruck Daten in DB schreiben damit der Worker arbeiten kann
- X- und Z-Bon erstellen
- Noch ganz viel mehr...
- Irgendwann auch Pfandberechnung
- Pfandbon-Druck mit Barcode. Nach Einlösen Code wieder löschen.
Und wenn irgendwann mal Zeit ist:
- Inkassoübergabe an Inkassobüro
- Bonitätsprüfung
31.10.2011
Was macht man wenn man nicht schlafen kann?
Na klar, programmieren. :D
Ich habe gerade den direkten Druck auf den eingestellten Bondrucker eingebaut. Morgen muss ich das mal testen. Als PDF gehts jedenfalls.
Ist zwar noch nicht schön, aber SELTEN. *grins*
Update: hat nicht geklappt. :(
10.11.2011
Jetzt war ich mal ein paar Tage krank und hab nix gemacht.
Heute hab ich den Kunden Edit Bereich überarbeitet.
11.11.2011 - 11.12.2011
Nachdem ich mal wieder neu installieren musste war das komplette Projekt weg. Schade aber auch. *heul*
Ich hab dann nochmal neu angefangen. Bis auf das "Print Preview" hab ich alles wieder so, wie es sein soll.
Weiterhin wird die Zwischensumme jetzt in Brutto und Netto angezeigt und die MwSt. wird (7% und 19% separat) angezeigt.
Die Artikel werden über AutoComplete Boxen ausgewählt.
Wenn alles klappt, werde ich morgen den Eintrag in die Datenbank vom bestehenden Warenwirtschaftssystem
erstellen, damit Rechnungen gedruckt werden können. Dazu muss ich, über eine Hilfstabelle den Einkauf speichern und beim
klick auf "Rechnung bezahlen" den Eintrag in die Datenbank erzeugen.
Wenn dann noch Zeit ist,
schau ich mal wie ich das mit dem Bon-Druck bewerkstellige. ;)