Nochmal was zur Buchführung. Wir haben
einfache Buchungssätze Konto1 gegen Konto2
zusammengesetzte Buchungssätze (mehr als 2 Konten berührt)
-Typ 1: Anteile der anderen Konten sind bekannt, kann automatisch gebucht werden (Z. B. alle Vorfälle mit festen Umsatzsteuersätzen)
-Typ 2: Art und Zusammensetzung verschieden, aber bekannt weil periodische Wiederholung (Z. B. Abbuchung von mehreren Leasingverträgen in einer Summe)
-Typ 3: Art und Zusammensetzung verschieden, aber unbekannt. (Z. B. eine Provisionszahlung in einer Summe, die mehrere Mitarbeiter betrifft, die dazugehörige Abrechnung ist aber noch nicht erstellt).
Den Typ 1 kann man völlig automatisieren, indem man für jede USt-Option ein Umsatzsteuerkonto festlegt, also 19% abziehbar, 19% abzuführen, 7% aufzuteilen usf. Der Anwender muß dann nur noch die Umsatz-Steuer-Option angeben (1...n)
Den Typ 2 kann man mit Buchungsstapeln automatisieren. Das empfiehlt sich, wenn die Geschäftsvorfälle komplex sind, z. B. 5 verschiedene Leasingverträge mit unterschiedlichen USt-Optionen in einer Summe abgebucht werden. Der Nachteil ist, wenn sich die Beträge im laufenden Geschädftsjahr ändern, daß man den Stapel zwar anpassen kann, aber rückwirkende Buchungen mit diesem Stapel dann zu Fehlern führen können.
Für den Typ2 bietet sich an, was man beim Typ3 sinnvollerweise sowieso macht, daß man
(1) zunächst mal den Gesamtbetrag auf ein Sammelkonto bucht (=Geschäftsvorfall ertragswirksam erfaßt)
(2..n) dann Zug um Zug alle betroffenen Konten gegen den Sammler ausbucht. Am Ende muß das Sammelkonto einen Saldo von
exakt 0.0 haben, sonst sind die Buchungen nicht vollständig.
Programmiertechnisch ist das ziemlicher Kinderkram.
Das große Problem bei der Programmierung von Anwendungen ist die Schnittstelle mit dem Anwender.
SCHNITTSTELLE ANWENDER
Diese muß einigen Voraussetzungen genügen, nämlich:
- soll den Anwender über den laufenden Vorgang ausreichend informieren (ist bei vielen Branchenlösungen nicht der Fall)
-soll technisch falsche Eingaben vermeiden (z. B. Vertipper oder ungültige Zahleneingaben)
-soll logisch falsche EIngaben abfangen (z.B. verkehrt herum gebucht etc.)
Je mehr man das Programm auf solche Weise "maßschneidert", umso weniger portabel ist es natürlich.
Die Schnittstelle hat aber von der Konsolenprogrammierung her gesehen noch ganz andere PRobleme, nämlich eine grafisch/optisch vernünftige Bedieneroberfläche zu schaffen und dafür die VOraussetzungen.
Nichts davon bringt die Programmiersprache C von sich aus mit.
Wie man sieht, hab ich die Konsole erstmal verbreitert, damit mehr als 80 Textzeichen untergebracht werden können, sowie Hintergrund und Textfarbe geändert. Auf einem Monitor mit ca. 1900 Pixeln Breite kann man so problemlos ca. 160-200 Zeichen in der Breite unterbringen, und ca. 50 Zeilen in der Höhe, ohne daß das Fenster über den Rand hinausschreibt, also mit der Maus wieder zurechtgesetzt werden muß.
Dieser Bereich entspricht ungefähr dem, was man hätte, wenn man ein A4 Blatt quer bedrucken will, und ist mehr als ausreichend für die Aufgabe, Zahlen in Tabellenform zu erfassen und formatiert auszugeben.
Wichtig ist nun, daß man die Zeichen nicht zeilenweise ausgibt, sondern die Position des Cursors wahlfrei festlegt, nämlich Spalte/Zeile.
Dazu gibt es aus guten alten DOS Zeiten die Funktion gotoxy(spalte, zeile), die in C nicht existiert.
Zweitens benötigt man eine Funktion, um den Bildschirm zu löschen.
Beides kann man sich leicht selbst programmieren:
void gotoxy ( short x, short y )
{
COORD coord = {x, y};
SetConsoleCursorPosition ( GetStdHandle ( STD_OUTPUT_HANDLE ), coord );
}
setzt den Cursor an die gewünschte Position. Die Syntax ist ein Windows-Systemaufruf
Den Bildschirm zu löschen ist ebenfalls ein Systemaufruf:
void clrscr(){system("cls");}
Hier ist die Routine, um den Bildschirm auf die gewünschte Breite und Höhe zu justieren:
void ResizeConsole(short x, short y)
{
HANDLE hStdout;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO Info;
SMALL_RECT rcWindow;
// Aktuelle Fenster- und Buffergröße
GetConsoleScreenBufferInfo(hStdout, &Info);
// Neue Fenstergröße
rcWindow = Info.srWindow;
rcWindow.Right = x;
rcWindow.Bottom = y;
// Neue Buffergröße, wenn nötig
COORD size = Info.dwSize;
if (size.X < x) size.X = x+1;
if (size.Y < y) size.Y = y+1;
SetConsoleScreenBufferSize(hStdout, size);
SetConsoleWindowInfo( hStdout, TRUE, &rcWindow);
}
... mit der dazugehörigen Funktion, welche das aufruft:
void konsole_anpassen()
{
ResizeConsole(KON_BREITE,KON_HOEHE);
}
Wir können uns damit den Konsolen-Bildschirm so zurechtmachen, wie es paßt.
Um Teilbereiche des Bildschirms zu löschen, geht man so vor, daß man in die entsprechende Zeile springt und einen Leerstring ausgibt, also eine Reihe von Leerzeichen, welche dann die bisherigen Zeichen überschreiben=löschen.
Die Länge dieser Leerstrings muß natürlich passen, sonst überlappt das in andere Bildschirmbereiche.
Dazu kann man sich den Bildschirm von vornherein aufteilen in Funktionsbereiche, sagen wir mal das Hauptprogramm soll oben links Zeile 0 bis Zeile 40 und Spalte 0 bis Spalte 79 laufen. Rechts davon der Bereich ist vorgesehen für Tabellen und sonstige Hilfefunktionen. Darunter der Bereich ist vorgesehen für Meldungen und Abfragen.
Wir hätten dann den Bildschirm in 3 nebeneinanderliegende Fenster aufgeteilt, die separat verwaltet werden.
Abbildung zeigt einen screenshot aus dem laufenden Programm, wo man das schön erkennen kann.
Wir haben hier den linken Bildschirmbereich für den Dialog, den rechten für das Hilfemenu.
Und sehen eine KONTEXTSENSITIVE Hilfestellung, die sich also automatisch aktiviert (besser als alles, was mit Fenster anklicken zu tun hat, weil ergonomischer)
Das Problem beim Buchen ist ja: auf welches Konto? Also will man die verfügbaren Konten nachschlagen.
Das Programm macht nun folgendes:
Sobald der Anwender die erste Ziffer der vierstelligen Kontonummer eingibt, zeigt es rechts die gesamte Kontenklasse mit allen Unterkonten.
Gibt der Anwender die zweite Ziffer ein, sagen wir Nr.1 = 4, Kontenklasse 4, 2. Ziffer =2, zeigt das PRogramm alle Unterkonten mit der Ziffernfolge 42xx
Das macht es, ohne daß man umständlich irgendein Fenster hätte öffnen, resizen, verschieben und schließen hätte müssen.
KONSOLE ist für solche Anwendungen meiner Meinung nach SEHR VIEL BESSER als bunte Windows-Anwendungen.
Was man nicht sieht, der untere Bereich (die letzten 5 Zeilen) bildet den Ort für Meldungen, Warnungen und Abfragen.
Der Beitrag wurde von sharky bearbeitet: 20.01.2012, 15:25 Uhr
Angehängte Datei(en)
screenshot1.jpg ( 294.47KB )
Anzahl der Downloads: 30