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 Kritik, Hilfe, Texten und Proceduren wäre ich dankbar. Bezugsquellen von Start.PDF Zu beziehen bei Hanno.Kniebel@t-online.de Veröffentlichungen teilweise im VDP-Forum http://www.wartungsprogramm.de/startx.pdf Groß und Kleinschreibung unbedingt beachten! Start.doc 1
Inhaltsverzeichnis VORWORT...1 Bezugsquellen von Start.PDF...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...14 Präfix...15 Fehlermeldung...16 4. SCHRITT RECHNUNGSBERECHNUNGEN...18 5. SCHRITT RECHNUNG DRUCKEN...22 6. SCHRITT DIE OPTIMIERUNG...31 7. SCHRITT JOB-ERWEITERUNG...34 8. SCHRITT RECHNUNG PRÜFROUTINE...41 RECHNUNGEN TEIL 2...43 ERWEITERUNGEN...43 PROGRAMM-VORGABEN / EINSTELLUNGEN...46 USERSYS...47 Absender im Rechnungskopf...48 Adressen übernehmen / einlesen...51 PAPIEREINSTELLUNGEN...56 SYSTEM / USERSYS-Felder...56 Job-Anpassung...57 Formular Einstellungen...58 Rechnungsformular anpassen...59 DER FERTIGE JOB...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 ANWER-EINSTELLUNGEN...72 TABELLENAUFBAU...72 INFORMATIONEN ZU EINERADRESSE...75 AUFBAU UND FUNKTIONSBESCHREIBUNG...75 Start.doc 2
JOBS...78 MEHRFACH DRUCKEN MIT NUR EINEM JOB...78 BILD-POSITIONIERUNGIM JOB...80 Hier nun die relevanten Zeilen in einem Job zur Bildposition...82 JOB-AUFBAU MIT FLEXIBLER BILDPOSITIONIERUNG...83 STARTBILDSCHIRM / BILDSCHIRMGRÖßE...88 ALLGEMEINES...91 AUFRUF VON PROCEDUREN...91 Rückgabewerte...91 Aufruf über einen Schalter...91 Aufruf über eine Procedur...92 Aufruf direkt...92 Übergabewerte aus Procedur...93 GRUNDFUNKTIONEN...93 NEUE DATENSÄTZE EINGEBEN...93 LÖSCHEN MIT ANGEKOPPELTEN DATENSÄTZEN...96 Allgemeines...96 Zum Löschen selbst...97 ARCHIVIEREN...100 Einfache Tabelle archivieren...101 Procedur für Oberflächen-Markierungen...102 Procedur für Tabellenmarkierungen...103 Archivieren/Kopieren mit Koppeltabelle...104 Mehrere Datensätze mit Kopplung kopieren...106 Kopieren und sofortiger Wechsel ins Archiv...109 VIELE TABELLEN, SCHLECHTE STRUKTUR?...112 TEXT-DATEI MIT PREISEN EINLESEN...115 Grundsätzliches...116 Projektbeschreibung...116 Das Projekt...116 MAILEN MIT PPWEB.DLL...118 WARENWIRTSCHAFT...121 KLEINE FACHKUNDE...121 BESTELLWESEN ALLGEMEINES...122 BESONDERE FELDER...123 ERFORDERLICHE ABFRAGEMÖGLICHKEITEN...123 AUFBAU...123 STAMMARTIKEL...125 NEUEINGABE EINER BESTELLUNG...125 DETAILBESCHREIBUNGEN ZU DEN FELDERN DIESER SEITE...126 Belegdatum...126 Bestellnummer...126 Lieferant...128 Formulartitel...130 Start.doc 3
Archivieren Archivieren ist ein umfangreiches Thema. Es wird in folgende Abschnitte unterteilt. 1. Archivieren einfacher Tabellen 2. Archivieren von Tabellen mit Koppeltabelle 3. Archivieren von Tabellen mit Memo-Datei und Koppeltabelle 4. Archivieren mit Druckparametern 5. Archivieren als Datensicherung Immer wieder gibt es Situationen bei denen wir archivieren müssen oder wollen. Beispiele hierfür sind sehr vielfältig. Auch ist es eine Möglichkeit in einer Mehrplatzanwendung das Löschen zu unterbinden. Der Anwender betätigt den Schalter zum Löschen eines Datensatzes. Der Datensatz wird aber nicht gelöscht, sondern nur in eine andere Tabelle Kopiert und dann aus der Haupttabelle erst gelöscht. Hierbei ist eine Wiederherstellung möglich, oder Sie entscheiden, ob wirklich gelöscht wird. Zur Realisierung des Archiviervorgangs gibt es unterschiedliche Ausgangssituationen und somit auch unterschiedliche Lösungen. 1. Daten aus nur einer Tabelle sollen in eine Archiv-Tabelle archiviert werden. 2. Daten aus einer Hauttabelle mit einer Koppeltabelle sollen in eine Archivtabelle mit Koppeltabelle archiviert werden. 3. Es soll jeweils nur ein Datensatz archiviert werden 4. Es sollen jeweils alle markierten Datensätze markiert werden 5. Andere Vorraussetzungen sind auch noch möglich Lösungsmöglichkeiten Die einfachste Voraussetzung zum Archivieren ist der Fall, dass nur eine Haupttabelle vorhanden ist, deren Daten in eine Archiv-Tabelle geschrieben werden sollen. Start.doc 100
Hierfür besteht sogar die Möglichkeit, das die Daten ohne programmieren zu müssen, verschoben werden können. Der Weg ist nicht unbedingt die feine Art, aber es geht folgendermaßen. Sie wechseln in die Archivtabelle, wählen unter Tabelle Datensätze importieren, wählen die Haupttabelle, setzen die gewünschten Selektionsmerkmale und importieren. Wenn diese Datensätze in der Haupttabelle gelöscht werden sollen, wechseln Sie nun dorthin, setzen die gleichen Selektionsmerkmale, Ansicht nur markierte und löschen dann alle Datensätze.Fertig Lösung 1 Nun machen wir es etwas eleganter für unser Tabelle ohne Koppeltabelle. Aber bereits hier gibt es unterschiedliche Aufgaben und somit unterschiedliche Lösungen. Erste Frage ist, wie erfolgt die Markierung der zu archivierenden Datensätze? Durch eine Oberflächenmarkierung oder eine Tabellenmarkierung? Eine schwere Frage? Nein, VDP liefert eine Erklärung hierzu die folgendermaßen lautet: StarNum liefert die Anzahl der sichtbaren Markierungen im aktuellen Datenfenster. Die sichtbaren Markierungen sind diejenigen, die mit einem Sternchen angezeigt werden. Sie werden auf Oberflächen-Markierungen genannt. Deshalb ist StarNum eine Oberflächen-Funktion. NMarks dagegen liefert die Anzahl der internen Markierungen der Tabelle zurück und ist daher eine Tabellen-Funktion. Inhaltsverzeichnis Einfache Tabelle archivieren Eine Oberflächenmarkierung können Sie durch Doppellklick oder dem entsprechenden Schalter erstellen. Also, wenn wir einen Datensatz markieren und ein Sternchen sehen ist es eine Oberflächenmarkierung und sieht ähnlich der folgenden Abbildungen aus. Start.doc 101
Wenn Sie also auf diese Art bestimmen möchten was archiviert werden soll, verwenden Sie folgende Procedur, die Sie einfach auf Ihre Gegebenheiten anpassen können. Procedur für Oberflächen-Markierungen Mit Stern markierte werden übertragen Procedure MarkierteArchivieren VARDEF RNo : REAL If Starnum =0 Message("nichts markiert") Return Else Message(STR(Starnum)+ " Artikel werden übernommen") SetSortOrder("Markierung"); RNo:=FirstRec(HAUPTTABELLE) WHILE RNo > 0 ReadRec(HAUPTTABELLE,RNo); ARCHIV.Feld1 := HAUPTTABELLE.Feld1; ARCHIV.Feld2 := HAUPTTABELLE.Feld2; WriteRec(ARCHIV,FileSize(ARCHIV)+1); RNo := NextRec(HAUPTTABELLE); End..falls nicht gelöscht werden soll können folgende Zeilen entfernt werden If NMarks(HAUPTABELLE)>0 Access(HAUPTABELLE,"Markierung"); While ReadRec(HAUPTABELLE,RecNr(HAUPTABELLE)) IF Message("Wollen Sie die Ersatzteile zum Wartungsbericht wirklich alle löschen?", "Löschen-Sicherheitsabfrage", 2) = 2 RETURN WartenStart("Jetzt wird gelöscht...") pause (50) While ReadRec(HAUPTABELLE,FirstRec(HAUPTABELLE)) DELRec(HAUPTABELLE,RecNr(HAUPTABELLE)); HideWait Endproc Start.doc 102
Procedur für Tabellenmarkierungen Wenn Sie jedoch bestimmte Suchfunktionen vorschalten und mit Tabellenmarkierung arbeiten, dann verwenden Sie folgende Procedur. Im wesentlichen wird hierbei lediglich Starnum gegen Nmarks getauscht Procedure MarkierteArchivieren; VARDEF RNo : REAL..If Starnum =0 if nmarks(haupttabelle)= 0 Message("nichts markiert") Return Else.. Message(STR(Starnum)+ " Artikel werden übernommen") Message(STR(nMarks(HAUPTTABELLE))+ " Artikel werden übernommen") SetSortOrder("Markierung"); RNo:=FirstRec(HAUPTTABELLE) WHILE RNo > 0 ReadRec(HAUPTTABELLE,RNo); ARCHIV.Feld1 := HAUPTTABELLE.Feld1; ARCHIV.Feld2 := HAUPTTABELLE.Feld2; WriteRec(ARCHIV,FileSize(ARCHIV)+1); RNo := End NextRec(HAUPTTABELLE);.. falls nicht gelöscht werden soll, follgende Zeilen entfernen If NMarks(HAUPTABELLE)>0 Access(HAUPTABELLE,"Markierung"); While ReadRec(HAUPTABELLE,RecNr(HAUPTABELLE)) IF Message("Wollen Sie die Ersatzteile zum Wartungsbericht wirklich alle löschen?", "Löschen-Sicherheitsabfrage", 2) = 2 RETURN WartenStart("Jetzt wird gelöscht...") pause (50) While ReadRec(HAUPTABELLE,FirstRec(HAUPTABELLE)) DELRec(HAUPTABELLE,RecNr(HAUPTABELLE)); HideWait.. eventuell hier noch eine Sortierung einfügen Endproc Was Sie jetzt noch stören wird ist die leere Tabelle nach dem Löschen. Soll dieser Umstand beseitigt werden, Stellen Sie zu Schluß noch die Sortierung (oben in der Procedur markiert) ein mit folgenden Zeilen Sortierung("HAUPTTABELLE.ID") EndederTabelle; Refresh; Start.doc 103