Vorwort Lieber Leser, Sie werden sich sicher fragen, warum ich dieses schreibe. Ich habe oft viel Zeit gebraucht, um die einfachsten Programmierschritte zu begreifen. Wenn ein Könner, gleichgültig aus welchem Bereich, einem Laien etwas erklärt, setzt die Erklärung viel zu hoch an und setz viel zu viel voraus. Dieses möchte ich mit meinen Ablaufbeschreibungen verhindern und Neulingen helfen, nicht sofort zu verzweifeln. Auch ich freue mich mehr über Detaillierte Antworten, als nur auf Hinweise. Für mich gibt es wirklich keine dummen Fragen. Wenn jemand ein Problem hat soll er es mir nennen (an Hanno.kniebel@t-online.de ). Ich werde dann an dieser Stelle, für jeden zugänglich, eine Ablaufbeschreibung erstellen. Hierdurch bedingt wird dieses Formular immer größer. Ich werde dann ein weiteres Dokument Start2.pdf bereitstellen, wo nur neue Themen sind. Start.pdf wird jeweils um das neue Thema erweitert und soll zu einem Anfängernachschlagewerk wachsen. Fürjede Unterstützung in Form von konstruktiver Kritik, Hilfe, Texten und Proceduren wäre ich dankbar. Start.doc 1
Inhaltsverzeichnis VORWORT...1 INHALTSVERZEICHNIS...2 RECHNUNGEN TEIL 1...5 1. SCHRITT TABELLENAUFBAU...5 2. SCHRITT DATENEINGABE... 9 3. SCHRITT AUTOMATISCHE RECHNUNGSNUMMERN-VERGABE... 11 Alternative... 13 Automatische Nummernvergabe bei numerischen Feldern... 13 Präfix... 14 Fehlermeldung... 16 4. SCHRITT RECHNUNGSBERECHNUNGEN... 17 5. SCHRITT RECHNUNG DRUCKEN... 21 6. SCHRITT DIE OPTIMIERUNG... 30 7. SCHRITT JOB-ERWEITERUNG... 33 8. SCHRITT RECHNUNG PRÜFROUTINE... 40 RECHNUNGEN TEIL 2... 42 ERWEITERUNGEN... 42 PROGRAMM- VORGABEN / EINSTELLUNGEN... 45 USERSYS... 46 Absender im Rechnungskopf... 47 Adressen übernehmen / einlesen... 50 PAPIEREINSTELLUNGEN... 54 SYSTEM / USERSYS-Felder... 55 Job-Anpassung... 56 Formular Einstellungen... 57 Rechnungsformular anpassen... 58 DER FERTIGE JOB... 59 Zugang zu den Parametereinstellungen... 60 Job-Erweiterung / mehrfach drucken... 61 ZUGANGSBERECHTIGUNG / RECHTEVERGABE... 63 1. TEIL ALLGEMEINES... 63 Ablaufbeschreibung... 63 Unser Test-Projekt zum Lernen... 64 Möglichkeit 2... 68 Berücksichtigung beim Formularwechsel... 69 2. TEIL PASSWORTABFRAGE... 70 Nun die gesamte erweiterte Procedur... 71 ANWENDER-EINSTELLUNGEN... 72 TABELLENAUFBAU... 72 INFORMATIONEN ZU EINER ADRESSE... 75 AUFBAU UND FUNKTIONSBESCHREIBUNG... 75 Start.doc 2
.SETFONT Üs1 Rechnung.SETFONT Std $( "Anzahl":6 " ": 3 " Artikel" :25 "Einzelpreis":10 "Gesamtpreis":10).HL.Sub WAREN $( WAREN.Anzahl:5 " ": 3 WAREN. Artikel :20 WAREN.Einzelpreis:10:2 WAREN.Gesamtpreis:10).Endsub $(" ":35 "----------------------------") $(" ":35 "Netto":5 RechnungNetto:8:2) $(" ":35 "MwSt":5 RechnungSteuer:8:2) $(" ":35 "Ges.":5 Rechnungssumme:8:2).EPILOG..Ergebnis wird vom Job berechnet..$(" ":35 "----------------------------")..$(" ":35 "Netto":5 Sum(Gesamtpreis):8:2)..$(" ":35 "MwSt":5 Sum(Gesamtpreis* 0.16):8:2)..$(" ":35 "Ges.":5 Sum(Gesamtpreis* 1.16):8:2) Was nun noch fehlt für das Rechnungsformular ist die Adressenübernahme aus der Adressendatei. Hierfür gibt es aber erst einmal ein Themenwechsel. Adressen übernehmen / einlesen Unser Rechnungsformular sollte bereits die notwendigen Felder für die Anschrift enthalten. Wenn nicht, dann holen wir dieses sofort nach und ergänzen die Tabelle Rechnungen um die fehlenden Felder und nehmen diese Erweiterungen auch in den beiden vorhandenen Rechnungsformularen auf. Das Formular für die Rechnungs-Neueingabe dürfte nun mit den Anschriftsfeldern und der kleinen kosmetischen Korrektur in etwa so aussehen: Start.doc 50
Dieses waren die notwendigen Änderungen an der Tabelle Rechnungen. Jetzt wird die wichtige Adressentabelle vorbereitet. In unserem Projekt befindet sich lediglich nur ein Formular für die Adressentabelle. Das wird sich aber sofort ändern, denn wir legen uns ein neues Formular für für die Adressenauswahl an. Ich nenne diese Formular Adrexpo Die Funktionsmöglichkeiten dieses neuen Formulars sind sehr minimal gehalten, denn hier sollen ja lediglich Anschriften augewählt werden können. Dieses Formular arbeitet mit einigen Proceduren zusammen. Also Erstellen wir auch noch ein Modul zur Adressentabelle. Der erste Luxus zu diesem Formular ist eine beim öffnen aufgerufene Dialogbox, in welche Sie den gesuchten Namen eintragen werden. Start.doc 51
..Aufruf beim Öffnen ADREXPO PROCEDURE Suchnamenexpo;?Getmode =0/ T-Eingabe :="" If Input ("Name eingeben...")=1 SetSortOrder("ADRESSEN.ID") Suchen("ADRESSEN.ID",T-Eingabe) End End ENDPROC; Natürlich platzieren wir auch noch einen Schalter zur Namenssuche in dieses Formular. Was geschieht nun nach der Selektion des Datensatzes? Was ist zu machen? Richtig, wir müssen den Datensatz speichern. Die Speicherung kann direkt in der Rechnungstabelle erfolgen, oder aber in einem Zwischenspeicher. Für diese Speicherung habe ich aus unterschiedlichen Grüden, auf die ich später eingehen werden, eine Speicherung in einer sep. Tabelle ADRSYS gewählt, die wir nun auch unserem Rechnungsprojekt zufügen werden. Folgende Felder enthält ADRSYS Nun kann die Adressenspeicherung erfolgen. Für die Speicherung sorgt folgende Procedur die beim Verlassen oder Schließen! Des Adressenformulars aufgerufen wird...04 Adresse in ADRSYS speichern PROCEDURE Adressepeichern(DUMMY: real); ReadRec(ADRSYS,1); ADRSYS.Name := ADRESSEN.Name; ADRSYS.Vorname := ADRESSEN.Vorname; ADRSYS.Zusatz := ADRESSEN.Zusatz; ADRSYS.Straße := ADRESSEN.Straße Start.doc 52
ADRSYS.PLZ := ADRESSEN.PLZ ADRSYS.Ort := ADRESSEN.Ort WriteRec(ADRSYS,1); ENDPROC; Halt! Stop! Wir sind noch nicht fertig. Wir müssen ja noch die Adresse aus der ADRSYS-Tabelle bekommen. Und elegant soll das auch noch werden! Also los, jetzt kommen die Tricks, die es in sich haben! Jetzt ist wieder das Rechnungs- Neueingabe-Formular dran. Es wird verfeinert! Wir nehmen uns nun das Feld Name vor und verändern die Eigenschaften hierfür etwas. Es bekommt zusätzlich eine Nachschlagetabelle bestimmt, ADRESSEN mit dem Formular Adrexpo auf das Feld Name. Start.doc 53
Eine sofort sichtbare änderung ist ein Fragezeichen rechts im Feld Name. Mit dieser Einstellung kann ich lediglich ein Feld, nämlich das Feld <Name>, einlesen. Um aber auch die anderen Felder einlesen zu können, rufe ich beim Verlassen des Feldes Name eine Procedur auf, die die fehlenden Daten zu dieser Anschrift aus der ADRSYS liest und ergänzt. Diese Procedur nenne ich Adrschreiben und sieht wie folgt aus PROCEDURE Adrschreiben(DUMMY: real); ReadRec(ADRSYS,1); RECHNUNG.Straße := ADRSYS.Straße; RECHNUNG.PLZ := ADRSYS.PLZ; RECHNUNG.Ort := ADRSYS.Ort; RECHNUNG.Vorname := ADRSYS.Vorname; Attach; Refresh; ENDPROC; Nun sind wir ferig und bereit, Adressen einzulesen. In einer Netzwerkumgebung ist diese Tabelle natürlich lokal zu platzieren. Papiereinstellungen Start.doc 54