0

Aus Auftrag eine Rechung erstellen

Hallo an Alle,

Ich habe zwei Tabellen erstellt, eine Tabelle heißt 'Aufträge' und die zweite Tabelle lautet 'Rechnungen'.

 

Folgende Situation liegt vor:

 

Ein Auftrag besteht aus verschiedenen Positionen, ua. der eigentliche Betrag des Auftrags, zzgl. Nebenkosten, andere Kosten usw. So ergibt sich ein Gesamt-Aufragsvolumen über einen Betrag YX.

Nun möchte ich dem Kunden eine Rechnung schreiben. Zunächst wird aber nur ein Teil des gesamten Auftagsvolumens in Rechnung gestellt, zB nur die Nebenkosten. In einer anderen Rechnung der Rest.

Es kann aber auch sein, dass ein Kunde seine Rechnung komplett bezahlt.

 

Frage: Wie kann ich, in einem Fall, den kompletten Auftrag in die Tabelle 'Rechnungen' übertragen und wie kann ich, in einem anderen Fall, zunächst zB nur die Nebenkosten (und/oder andere Kosten) in Rechnung stellen?

Vielen Dank.

Gruß Kruna

36 Antworten

null
    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Kruna, sowas lässt sich wie gesagt nicht pauschal mit ein paar Zeilen Standard-Code abhandeln. Ich habe deshalb einfach mal ein paar Annahmen getroffen:

     

    Die Tabellen 'Aufträge' und 'Rechnungen' sind nicht miteinander verknüpft.
    Die Positionen befinden sich jeweils in einer Untertabelle ('AF_Positionen' bzw. 'RE_Positionen') und bestehen aus den Feldern 'Bezeichnung' und 'Betrag'.
    Die Rechnungsnummer wird über einen Trigger "Bei neuem Datensatz" in der Tabelle Rechnungen erzeugt.

     

    Dann könnte man in der Tabelle 'Aufträge' eine Schaltfläche erstellen ("Rechnung erzeugen" o. ä.) und darin folgenden Code ausführen lassen:

     

    let myAF := this;
    let newRE := create 'Rechnungen';
    newRE.(
        Kunde := myAF.Kunde;
        Rechnungsdatum := today();
        for i in myAF.AF_Positionen do
            let newRE_Pos := create RE_Positionen;
                newRE_Pos.(
                    Rechnungen := newRE;
                    Bezeichnung := i.Bezeichnung;
                    Betrag := i.Betrag
                );
        end
    );
    openRecord(newRE)

     

    Damit würde eine neue Rechnung erzeugt und die Stammdaten (hier: 'Kunde') sowie sämtliche Positionen des Auftrags übernommen. Will man nicht alle Positionen abrechnen, kann man die jeweils nicht zutreffenden einfach löschen.

     

    Als technische Basis sollte das prinzipiell funktioneren. Es könnte bspw. sinnvoll sein, auch 'Aufträge' und 'Rechnungen' miteinander zu verknüpfen, außerdem beide Tabellen mit 'Kunden'. Als Variante ließe sich auch in den Auftrags-Positionen festlegen, welche berechnet werden sollen und welche nicht. Und natürich müsste man auch die Datenfelder ergänzen, die vom Auftrag in die Rechnung übernommen werden sollen (inkl. Positionen).

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo,

    vielen Dank für Deinen Ansatz. Deine Annahmen sind völlig korrekt und die Schaltfläche funktioniert auch prima, wirklich ganz toll, aber irgendwie läuft es nicht ganz so rund, wie ich mir das vorstelle. Das liegt jedoch natürlich eher an mir. Nach gut einer Woche intensiv-'ninoxing' (was super viel Spaß macht), verliere ich mich wahrscheinlich gerade an unwesentlichen Dingen, anstatt das Wesentliche vor Augen zu sehen. Denn, wie ich gerade festgestellt habe, habe ich nicht viel mehr erreicht, als wenn ich eine neue RG erstelle und dann die Positionen einfach lösche, die schon abgerechnet waren.

     

    Ehrlich gesagt habe den letzten Abschnitt nicht ganz verstanden.

    Ich habe beide Tabellen mit 'Kunden' verknüpft und 'Aufträge' mit RG. Eine Idee war, die Tabelle 'Aufträge' in Untertabelle 'RG-Positionen' mit einzubinden, auch das macht, glaube ich, nicht viel Sinn.

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Nun, deine Frage war ja, wie man "den kompletten Auftrag in die Tabelle 'Rechnungen' übertragen" kann. Genau das macht obiges Skript. Ist ja was anderes als eine bereits vorhandene Rechnung zu duplizieren.

     

    Ich habe mal eine kleine DB mit Minimal-Inhalten erstellt, aus der das Datenmodell hervorgeht. Kannst ja mal reinschauen, vielleicht erklärt es, was ich meine:
    https://www.dropbox.com/s/w9amn3xl5vp9lk2/Auftrag_zu_Rechnung.ninox?dl=0

     

    Alles weitere hängt wie gesagt von sachlichen Faktoren ab, die ich natürlich nicht kenne. Zum Beispiel: Auf welche Weise willst du die Abrechnung von Aufträgen nachhalten? Das naheliegendste wäre m. E., über die Aufträge zu gehen und dort zu schauen, welche noch nicht komplett abgerechnet sind.

     

    Und was den zweiten Teil deiner Frage betrifft "wie kann ich, in einem anderen Fall, zunächst zB nur die Nebenkosten (und/oder andere Kosten) in Rechnung stellen?"

     

    Entweder, in dem man die nicht zu berechnenden Positionen einfach aus der Rechnung löscht. Eleganter, aber auch etwas aufwändiger wäre, wie ich schrieb: "Als Variante ließe sich auch in den Auftrags-Positionen festlegen, welche berechnet werden sollen und welche nicht." Weitere Möglichkeit: Beim endgültigen Festschreiben der Rechnung über ein Skript die betreffenden Posktionen im dazugehörigen Auftrag als "abgerechnet" markieren.

     

    Kurzum: Der Möglichkeiten zur Ausgestaltung und Optimierung sind viele. Entscheidend ist, dass man erst mal einen Plan hat, wie man vorgehen will. Dann kann man im nächsten Schritt überlegen, ob und wie sich das mit Ninox umsetzen lässt.

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Guten Morgen,

    So, nach kurzer Pause, bin ich wieder im Ninox-Fieber!

     

    Die DB ist echt super Klasse!!!! ich werde sie auf jeden Fall in meine DB mit integrieren. Das ist echt toll! DANKE!!!!

     

    'Das naheliegendste wäre m. E., über die Aufträge zu gehen und dort zu schauen, welche noch nicht komplett abgerechnet sind' - Ja, genau das meine ich und wie erreiche ich das zu sehen? Ich sehe zZT natürlich nur den kompletten Auftrag.

    Ich meine, natürlich weiß ich ganz genau, daß ich noch eine RG schreiben muss. An wen und wieviel usw. Gerade heute ist es ja leider sehr überschaubar...noch! Man möchte aber doch vorrausschauen und natürlich könnte ich auch Notizen oder Todo oä. erstellen, aber Ninox ist, als ob man sich ein Haus bauen würde. Jeden Tag gibt etwas zu tun und zu werkeln.

    Leider kann ich als Anfänger keine Scripts schreiben kann und somit ist es etwas schwierig einzuschätzen. Ich bin ja immer wieder fasziniert, wie Du (und auch andere) das alles kannst! Echt toll! Und wirklich, vielen Dank für die tolle Unterstützung und Ideen und Geduld. So, dass mal kurz am Rande erwähnt...

     

    'AuftragsPosition festlegen, welche berechnet werden sollen und welche nicht' - sorry, jetzt schreibe ich wahrscheinlich eine doofen (augenverdreher) Satz - Ich weiß ja nicht vorher, welche Positionen bezahlt werden bzw, könnte es bei jeder RG anders sein.

    Daher denke ich, dass es eher Sinn macht, wenn ich beim Auftrag XY einen Teil der RG geschrieben habe, diese 'irgendwie' vom Auftrag 'subtrahieren' kann und wie Du schreibst 'markieren'? Ich denke, dass dieser Lösungsvorschlag eher für mich zutrifft.

     

    Gruß Kruna

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ohhh, entschuldige, ich habe erst jetzt gesehen, dass man in deiner DB sehen, kann wieviel noch offen ist. Daran werde ich erst einmal weiterarbeiten.

    DANKE udn Gruß

    Kruna

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Das wirklich Geniale an Ninox ist ja, dass man nicht jedes Detail vorher festlegen und jede Eventualität berücksichtigen muss, um seine Lösung dann in einem Rutsch fertig zu entwickeln. Man kann ganz klein anfangen und Schritt für Schritt im laufenden Betrieb weiterentwickeln.

    Deine Abrechnung von Aufträgen ist ein gutes Beispiel dafür. Natürlich kann man das mit Ninox noch weiter ausfeilen und automatisieren. Aber vielleicht genügt es ja erst mal, dass man in der Auftragsübersicht erkennt, welche komplett abgerechnet sind und welche nicht. Dann kann man das schon nutzen, derweil an anderen Bereichen weiterarbeiten, dazulernen und sich mit dem gewonnenen Wissen später nochmal der Verbesserung der Auftragsabrechnung widmen.

    Mein Tipp deshalb: Nicht versuchen, sofort die perfekte, alle denkbaren Szenarien berücksichtigende Lösung zu entwickeln, sondern eine erste brauchbare Basislösung zu entwickeln und diese dann aus der Praxis heraus schrittweise auszubauen und weiterzuentwickeln.

    Man könnte auch sagen: Eine individuelle Ninox-Lösung ist niemals wirklich fertig. Aber das ist in diesem Fall kein Makel, sondern ein Feature. Weil sich mit der Zeit ja auch die eigenen Abläufe und Anforderungen ändern. Und Ninox lässt sich solchen Veränderungen immer wieder anpassen.

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo,

    hilfreiche Zeilen, die Du schreibst, Danke Dir.

    Nun habe ich zwei Tage und fast 'Nächte' damit verbracht, das Thema 'Auftrag zu Rechnung' zum Laufen zu bringen, leider ohne Erfolg.

    Vielleicht habe ich die Dinge auch 'überdimensioniert', vielleicht habe ich zu kompliziert um die Ecke gedacht und nun habe ich ein totales Brett vor dem Kopf und es 'raucht' nur noch da oben!

    Irgendwie bekomme ich es nicht hin, das alle Positionen von Auftrag zu Rechnung übertragen werden. Kann es daran liegen, dass einige Positionen in AF_Positionen Auswahlfelder sind? Jetzt bin bin auch bzgl Auswahlfeld total durcheinander. Auswahlfeld 1= Kosten tgl., 2= Kosten mtl.  1= 10,00€, 2=100,00€. Brauche ich dann zwei Felder, wenn es um die Auswahl geht oder reicht ein (Text, Zahlen?)Feld, bei dem mittels Script entweder 10,00 oder 100,00 eingetragen werden. Ich bin da echt total durcheinander!

    Desweiteren habe ich nicht nur 'Bezeichnung' und 'Betrag', vielmehr hat eine Bezeichnung mehrere Beträge (zB verschiedene zusätzliche Kosten).

     

    Dann steht bei mir im Feld 'offen' -0,00€, weißt Du woran das liegen könnte? Wobei das gerade mein aller geringstes Problem ist.

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Kruna, ich tue mich auch hier wieder schwer, das konkrete Problem zu identifizieren.

    >>Irgendwie bekomme ich es nicht hin, das alle Positionen von Auftrag zu Rechnung übertragen werden.<<

    Der Code, den ich oben gepostet hatte und der sich auch in der Demo-DB findet, überträgt ja alle Positionen von Auftrag zu Rechnung. Die Tatsache, dass da jetzt Auswahlfelder mit übertragen werden, kann allein eigentlich kaum Grund dafür sein, dass es jetzt nicht mehr funktioniert. Schlimmstenfalls würden vielleicht einzelne Feldinhalte nicht korrekt übernommen, aber die Position selbst müsste eigentlich trotzdem übertragen werden.

    Bevor ich aber nun versuche, zu interpretieren und jede Möglichkeit durchzuspielen, schlage ich vor, dass du die Datenbank irgendwo zum Download auf einen Server legst. Dann kann man selbst mal den Anlasser bestätigen und unter die Haube schauen.

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Da hast Du absolut recht! Ich werde die DB nochmal überarbeiten und die Preisgestaltung neu und vereinfacht aufsetzen.

    Ich habe mir da so einen Kopf gemacht, dass ich gerade selbst nicht durchblicke, geschweige denn auch noch erklären könnte, welche Fehlerquellen wo sein könnten. Ich werde dann heute Abend die DB im Webinar 2020 zum testen hochladen und gebe dann nochmal hier Bescheid. Wäre das ok für Dich?

     

    Vielen Dank für all Deine Bemühungen!

    Gruß

    Kruna

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ja, klar, lade die DB hoch, ich schaue dann gerne mal rein.

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    GUten Morgen,

    ich habe nun die DB hochgeladen - TestDB.

    Wie bereits erwähnt, ich habe die Felder anders aufgesetzt, also ohne Auswahl usw. und siehe da, Dein Script funktioniert jetzt prima!

    Allerdings sind alle anderen Scripts, die wg Auswahlfeldern eingesetzt wurden nichtig und auch ein paar andere Fehler haben sich mit Sicherheit eingeschlichen.

    Aber schau erst einmal rein und 'tobe Dich aus! Du wirst bestimmt mehr sehen als ich.

    Vielen, vielen Dank!

     

    Gruß Kruna

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Kruna, ich habe vorhin kurz in die DB geschaut und gesehen, dass das Script zur Übertragung der Aufträge zu Rechnungen funktioniert. Schreibst du in deinem letzten Posting ja auch selber. Dieses Problem hat sich also offenbar erledigt.

    Wonach soll ich (oder sonst wer) jetzt genau schauen? Gibt's an irgendeiner Stelle ein konkretes Problem? Wo? Welches? "Austoben" ist ja schön und gut, aber dazu habe ich eigentlich genug eigene Baustellen. ;)

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Danke Dir, dass Du so schnell reingeschaut hast. Ich habe nun auch die Fehler soweit korrigiert und soweit funktioniert alles (noch) gut. Eine Frage hätte ich aber doch noch bzgl. Deines Scripts, welches ich echt super finde!!!

    Ist es möglich, dass das Feld 'Berechnet' in Tabelle Aufträge erst dann den Betrag anzeigt, wenn der Status in Tabelle Rechnungen auf 'Bezahlt' steht?

    'Austoben' war eher als Spaß zu verstehen, bezogen auf 'ich schaue dann mal gerne rein'. ;)

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Das Feld "Berechnet" hatte ja ursprünglich den Zweck, schnell die Aufträge zu erkennen, welche noch nicht komplett abgerechnet wurden. Damit man weiß, für welche Aufträge auch noch Rechnungen zu stellen sind. Ob eine Rechnung schon bezahlt wurde oder nicht, steht wiederum auf einem anderen Blatt (namentlich: in der Tabelle 'Rechnungen').

     

    Aber klar, natürlich kann man sich auch im Auftrag die bereits bezahlen Beträge der verknüpften Rechnungen anzeigen lassen. Das würde ich allerdings, ohne dir reinreden zu wollen, dann als zusätzliche Information mit einem neuen Berechnungsfeld namens "Bezahlt" oder so machen. Die Formel würde lauten:

     

    sum(Rechnungen.'Brutto-Gesamt:' where text(Status) = "bezahlt")

     

    Damit würden nur die Beträge der verknüpften Rechnungen summiert, bei denen im Auswahlfeld 'Status' die Option "bezahlt" gewählt wurde.

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ups, sorry, falsche Formel. Muss natürlich heißen:

     

    sum(Rechnungen[text(Status) = "bezahlt"].'Brutto-Gesamt:')

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    GUten Morgen,  das klappt prima! Alles so, wie es soll!!

    Vielen DAnk und ein schönes WE noch!

     

    Gruß Kruna

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Guten Morgen,

    entschuldige mich bitte, aber ich habe doch noch eine Frage bzgl des Scripts 'Auftrag_zu_Rechnung'.

    Irgrendwie wird die 'Bezeichnung' nicht mitübertragen. Allerdings gibt es dieses Feld nicht in AF_Positionen , sondern ist verknüpft mit Tabelle Standorte.

    Kann man Felder auch aus einer Verknüpfung heraus übertagen?

     

    Vielen Dank und Gruß

    Kruna

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Versuch's mal so (in dem Block nach "create RE_Positionen"):

     

    Bezeichnung := i.'Standorte_DW'.Standortbezeichnung;

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo,

    das hatte ich versucht, dann kommt folgende Fehlermeldung:

     

    Bildschirmfoto 2020-04-20 um 09.45.13

     

    Hast Du eine Idee, woran das liegen kann?

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ach ja, vielleicht ist es noch wichtig zu erähnen, dass das Feld 'Standortbezeichnung' in Tabelle 'Rechnungen' auch nicht vorhanden ist, sondern verknüpft ist mit Tabelle Standorte.

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Tabellenspalte = Datenfeld. Wahrscheinlich heißt das betreffende Feld nicht mehr 'Standortbezeichnung', weshalb es nicht gefunden wird.

     

    Klicke einfach links in der Feldübersicht auf den Pfeil nach "Standorte_DW", schaue dort, wie das Feld tatsächlich genau heißt und ersetze den Namen.

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    😱

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Wenn du die Verknüpfung zu den Standorten übernehmen willst, dann versuch's mal so:

     

    'Standorte_DW' := i.'Standorte_DW';

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Letzteres hat wunderbar geklappt! Tausend Dank!!!!

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Nebenbei: Grundsätzlich sollte man alle Daten, die fester Bestandteil einer gedruckten Rechnung sind, auch bleibend mit der Rechnung selbst speichern und nicht dynamisch über eine Verknüpfung einlesen. Sonst kann es passieren, dass der Rechnungsdatensatz später irgendwann nicht mehr exakt mit der gedruckten Rechnung übereintimmt, weil man den verknüpften Datensatz gelöscht oder inhaltlich verändert hat. 

     

    Wenn also wie in diesem Fall der Standort mit auf der Rechnung steht, dann sollte er auch fest im Datensatz gespeichert sein und nicht dynamisch aus einer Verknüpfung zu den Standorten gelesen werden.

     

    Meine Empfehlung wäre deshalb, in "RE_Positionen" ein Textfeld für die Standort-Bezeichnung zu erstellen und diesen nach dem Schema der ersten Formel "Bezeichnung := i.'Standorte_DW'.Standortbezeichnung" dauerhaft zu übernehmen. Dann ist es egal, wenn man den verknüpften Datensatz später löscht oder ändert. Das gilt ggf. natürlich auch für alle anderen Daten, die auf der Rechnung aufgeführt sind.

     

    Nur so als Tipp.

Content aside

  • vor 3 JahrenZuletzt aktiv
  • 36Antworten
  • 3728Ansichten