base

Folgende Beispiel-Datenbank hat zwei TEXT-Feldern:

Feld1 “TEXT” - Feld2 “ZEIT”

Ziel: Wenn im Feld TEXT ein Eintrag erfolgt, soll im Feld ZEIT automatisch die aktuelle Uhrzeit eingetragen werden und unverändert bleiben.

Im Rechenfeld ZEIT habe ich zuerst >IF LENGTH(text) > 0 THEN CURTIME ENDIF< eingetragen. Die Zeit wird auch vermerkt, aktualisiert sich jedoch bei jedem Neueintrag bei alles Datensätzen. Nutzt also nichts.

Habe im Rechenfeld schon alle möglichen Varianten versucht, klappt nicht.

Ähnlich ist es bei meinem Rechnugnsprogramm, das ich von FAKTURA abgewandelt und vielfach meinen Bedürfnissen angepasst habe:

Das Problem ist folgendes: Wenn ich eine neue Rechnung erstellen will, wird als erstes über die abgelegte Variable eine neue Rechnungsnummer generiert. Wenn ich es mir aber anders überlege und doch keine Rechnung schreiben will und das Formular wegklicke, ist die Nummer verbraucht und in der Nummerierung der Rechnungsliste fehlt sie. Das ist nicht schön und der Steuerberater fragt warum. Zunächst habe ich das Problem ruhen lassen.

Nunmehr will ich das Programm erweitern unt nicht nur Rechnungen sondern auch Angebote und Lieferscheine verfassen. Die haben inhaltlich dieselbe Struktur wie eine Rechnung. Insoweit kann das gleiche Eingabeformular verwendet werden. Ich habe ein Auswahlfeld “Angebot / Lieferschein / Rechnung” eingefügt.

Das Feld Rechnungsnummer soll mit einer IF/THEN-Verknüpfung die nächste Rechnungsnummer nur und erst dann kreieren, wenn im Auswahlfeld “Rechnung” steht.

Auch hier habe im Rechenfeld alle möglichen Varianten versucht, klappt nicht. Ergebnis wie oben. Im Besonderen kann man nach THEN keine zwei Aufträge geben (Übernimm VARIABLE als RN und erhöhe Wert der VARIABLE um 1)

Frage, Sitze ich wie man so sagt, auf dem Schlauch oder geht es wirklich nicht.

Wer weiss Rat?

Das lässt sich denke ich mit Hilfe eines weiteren Feldes realisieren. Dieses Feld fungiert als Statusmelder und zeigt an, ob die Zeit bereits eingetragen wurde oder nicht.

Dann baut man im Rechenfeld für das Feld Zeit noch eine weitere „If-Then“ Anweisung ein, die genau diesen Status abfragt.

Im Rechenfeld des Statusmelders müßte man dann eine Abfrage konzipieren, die bei TEXT>0 einen Wert setzt, den man dann wie oben erwähnt im Feld ZEIT abfragt.

So könnte es funktionieren.

LG

Frank

Nö meine Lösung funktioniert nicht. Auch mit hilfe des “geändert” Feldes kommt man nicht weiter.

Wozu genau benötigst Du ein solches Feld? Möglicherweise gibt es einen anderen Lösungsansatz.

Bezüglich der Rechnungsnummern in einer Tabelle die Rechnungen, Angebote und Aufträge gleichzeitig bearbeiten soll folgenden Idee:

Anstatt Variablen zu nutzen könnte man doch eine Relation auf die Rechnungsnummer derselben Tabelle kreieren und diese dann per Formel eins aufzählen.

Nachteil: man muß aufpassen dass man nicht die Falsche Nummer erwischt. Außerdem ist es wohl sinnvoll die Relation dann statisch zu schalten damit nicht nachträglich die RE-Nummern verändert werden.

War das hilfreich?

LG

Frank

Hallo comru.

Klar, dass Dir papyrus BASE die Systemzeit bei dieser Konstellation aktualisiert…

Wenn Du einen ereignisabhängigen Zeitstempel aber benötigst, hätte ich folgenden Vorschlag:

Füge Deiner DB-Tabelle zu den bestehenden noch ein DB-Feld SYSTEMzeit hinzu.

Vorzunehmende Einstellungen für DB-Felder:

DB-Feld SYSTEMzeit

Datentyp: Uhrzeit: HH:MM:SS (nicht zwingend)

Feldeigenschaften → Rechenfeld → Eingabefeld: Voreinstellungs-Formel für einen neuen Datensatz:

SYSTIME

Es wird empfohlen, das Feld nicht mit in das Eingabeformular aufzunehmen.

DB-Feld Zeit

Datentyp: Uhrzeit: HH:MM:SS (nicht zwingend)

Feldeigenschaften → Rechenfeld → Eingabefeld: Formel (definiert das Feld als Rechenfeld):

IF LENGTH(Text) > 0 THEN SYSTEMzeit

Erklärung:

Wird ein neuer Datensatz erzeugt, so ist das DB-Feld SYSTEMzeit stets mit der aktuellen Systemzeit vorbelegt.

Wird etwas in das Feld DB-Text eingegeben, erscheint der Wert des DB-Felds SYSTEMzeit.

Wird der Datensatz gespeichert, so bleibt Dir der (Zeit)Wert im DB-Feld Zeit auch tatsächlich erhalten, denn er wird in die Datenbank geschrieben.

Nummernkreise - z.B. für Angebot, Auftragsbestätigung, Rechnung, Lieferschein, Gutschrift …

Da gibt (gab) es hier schon eifrige Diskussionen.

Gebe doch einmal das Wort Rechnungsnummer in das Suche-Feld ein.

(Ich persönlich Favorisiere den Ansatz von fravo. Er (Ansatz) ist aber kein Allheilmittel.

Ich verlagere die Nummernkreise in DB-Tabellen. Als letzte Aktion - quasi wenn z.B. die Rechnung steht, hole ich mir die Nummer aus der entpr. DB-Tabelle Rg_Nr.)

Möglicherweise kann man auch noch einen völlig anderen Ansatz wählen.(?)

→ die Rechnung steht.

→ die Rechnung muss gedruckt werden - qausi der Report Rechnung.pap wird ausgeführt.

Jetzt der Gedanke.

Die Vergabe der Rechnungsnummer wird dialoggestützt durchgeführt. Etwa so:

Sie wollen eine Rechnung für Herrn XYZ aus Musterdorf erzeugen?

JA | ABBRECHEN

Wenn JA wird eine Report-Vorlage angestoßen - nämlich die, welche die Rechnungsnummern bereithält / generiert.

Ein weiterer Dialog fragt: Soll die Rechnungsnummer RG123/2010 vergeben werden?

Und jetzt sollte gedacht etwas ‘greifen’ - was nämlich hierbei der Vorteil sein könnte:

Wenn JA wird die Rechnungsnummer dem dafür vorgesehenen DB-Feld per LET zugewiesen.

Der Report Rechnung.pap wird erzeugt.

Wenn ABBRECHEN wird eine Abbruchsequenz eingeleitet und es sollte keine Modifikation der Rechnungsnummer stattgefunden haben, weil die erst stattfindet, wenn auf JA geklickt wird.

Außerdem wird die Erzeugung des Reports Rechnung.pap nicht ausgeführt - eine Rechnung ohne Rechnungsnummer braucht man in der Regel nicht.

Ungefähr so - ungeprüft. Könnte durchaus funktionieren.

Hätte auch noch den Charme, dass durch die Dialog-Unterstützung ‘Fremde’ sich damit besser zurechtfinden. Und man könnte in der Report-Vorlage Zugriffsrechte (USER) festlegen und damit verhindern, dass der angemeldete USER ABC, der keine Rechnung erzeugen darf, von papyrus BASE abgewiesen wird…

Habe hierzu schon mal einen Lösungsweg gezeigt:

http://www.papyrus.de/support/forum/index.php?t=msg&goto =4473&S=2e5a8a534ff5695ff57dc2c7e8b6e586#msg_4473]([

Der Ansatz in Kürze: Es wird erstmal keine ReNr und auch kein Datum erzeugt. Allerdings wird dem Report “Rechnung” ein Formelreport vorangestellt, der prüft, ob hier eine alte Rechnung zum wiederholten mal ausgedruckt werden soll (also ob die Felder schon mit Werten gefüllt sind) oder ein neue Rechnung, die noch keine Nummer und noch kein Datum hat. In dem Fall werden die genau in diesem Moment erzeugt.

Irgendwas an der Formel ist nicht ganz sauber, manchmal findet Papyrus die aktuelle Rechnungsnummer nicht, fängt dann bei 0 oder bei 989 an. Ich benutze das Ganze seitdem dennoch mit Erfolg. Meistens schreibe ich mehrere Rechnungen am Stück, dann trage ich die aktuelle Nummer einfach von Hand im Datensatz ein (und muss nicht in die Variablen). Dann werden alle folgenden Rechnungen sauber und fehlerfrei gedruckt und nummeriert.

Weil das Problem so aber noch nicht perfekt gelöst ist und meine Programmierkenntnisse begrenzt sind, gehe ich demnächst einen anderen Weg:

Ich habe eine Tabelle “Aufträge” da kommt einfach jeder Auftrag erstmal nur als Auftrag rein. Aufgebaut ist sie im Prinzip wie die Rechnungen, mit Posten und allem Pipapo. Da kann sich mal was ändern, da kommt was weg, da kommt was dazu, egal. Ich habe erstmal ein Auftragsdatum, irgendwann auch mal ein Lieferdatum. Erst wenn ALLES klar ist, Gehe ich in meine Tabelle Rechnungen, und drücke da auf Neue Rechnung und es wird erst dann eine neue Rechnungsnummer und das -datum kreiirt. Alle Posten, Adresse usw. übernehme ich aus einfach per Verknüpfung aus “Aufträge”.

Computertechnisch ist das alles andere als sauber,(es verdoppelt die Datenmenge) aber es ist einfach näher dran am Leben. Es sei denn, DotPap nimmt sich meiner Formel noch mal an, ich bin sicher, er kann das besser wie ich ;)](http://www.papyrus.de/support/forum/index.php?t=msg&goto=4473&S=2e5a8a534ff5695ff57dc2c7e8b6e586#msg_4473))

Hallo fravo, dotpap, blake,

entschuldigt, wenn ich erst heute antworte.

Ihr habt mir sehr geholfen, eines der Probleme ist gelöst:

Das aktuelle Datum zu speichern. Ich habe die Struktur noch anderweitig eingesetzt: Es ist eine Anwesenheits- bzw. Ankunftskontrolle. Ich kann es sogar mit Barcode und Scanner benutzen. Man muss lediglich unter Tastaturmakros/Datei bearbeiten/Neuer Datensatz/zu F2 noch RETURN hinzufügen. Wen es interessiert, bitte melden. So geht es: Siehe ZIP-Anhang.

Was mir noch nicht gelungen ist: Einfügen der Rechnungsnummer.

Ein Hinweis ‚Man könnte so machen‘ hilft wenig, hilfreich wäre ein Anhang > sogeht es. BASE könnte ein paar Verbesserungen bzw. Erweiterungen vertragen. Ich will dies aber hier nicht machen. Wenn Ulli alle Wünsche erfüllen wollte, bräuchte er ein Team von 20 Leuten. Das wärs. Tschüss comru

Datum_und_zeit.zip (2.96 KB)

Hallo dotpap.

Du schreibst:

Bis heute finde ich nirgendwo in der Hilfe, wie diese Dialoge bei der Reportausgabe erzeugt werden. Wie heisst denn der Befehl dazu?

Wär nett, wenn du hier mal ein Beispiel dazu geben könntest…

Ja, die Hilfe ist da schon lange nicht mehr aktuell.

Suuuper!

Vielen, vielen Dank.

Jetz verstehe ich nur noch Bahnhof.

Lieber glucose, kannst Du mir bitte erklären, wie Dein Beitrag programmiert wird, wie es funktioniert und zur lösung meines Problemes hilft.

Eines scheint mit nicht überwindbar, es ist nicht möglich if then …verändere Variable oder … = str(variable) AND verändere Variable

Gruss comru

Hallo blake,

hallo comru.

hier eine kleine DemoDB zur Vergabe von Rechnungsnummern.

Es ist lediglich ein Lösungsansatz. Vielleicht hilft es.

Ich möchte mich jetzt aber an dieser Stelle ausklinken -der Zeitfaktor - ich bitte um Verständnis.

Demo_RgNr.zip (5 KB)

Vielen Dank, dotpap,

Das Problem ist, dass der Gesetzgeber eindeutige, fortlaufende Rechnungsnummern verlangt. Dieses Problem hat übrigens Ulli in seinem Faktura-Programm auch.

Allerdings steht in der BASE-Hilfe der Satz: „Für spätere Papyrus-Versionen ist noch geplant, dass Variablen auch per Zuweisung auf bestimmte Ereignisse reagieren, die für einen Datensatz getätigt werden.“

Dann dürfte das Problem gelöst sein, wenn im Rechnungsnummer-Feld stehen kann:

if auswahl = ‚Rechnung‘ THEN LET variable = variable + 1 RETURN + STR(Variable)<

comru

Ich habe die Berechnung der Rechnungsnummer sozusagen aus der Datenbank herausgenommen und in ein Datenfeld des Rechnungsreports verlegt. Der prüft jetzt, ob schon eine Rechnungsnummer vergeben ist, oder nicht:

IF VAL(ReNr) > 0 THEN LET ReNr = ReNr ELSE LET ReNr = aktReNr + 1 LET aktReNr = ReNr

Wird die Rechnung zum erstenmal gedruckt, wird die neue Rechnungsnummer vergeben.

Wird die Rechnung - warum auch immer - nochmal gedruckt, wird KEINE neue vergeben, sondern die bestehende benutzt.

Das FA schreibt übrigens nur vor, das die Rechnungsnummern eine ungestörte Zahlenreihe ergeben müssen:

254,255,256,257 usw.

Die Reihenfolge muss nicht chronologisch sein, also mit dem Datum des Auftrags oder der Rechnungsstellung “harmonieren”. Wichtig ist, das keine Nummer fehlt, also keine Rechnung “verschwunden” ist.

Genau - blake.

Siehe montaliche Rechnung eines großen deutschen Telekommunikationsanbieters…

hä? wieso?