0

Bitte um Hilfe und Tips bezüglich Storno-Rechnung

Hallo an Alle,

wie löst ihr das, wenn eine Rechnung storniert werden soll (zB Falsche RG-Adresse)?

Habt ihr da zB ein Auswahlfeld (RG, StornoRG) oder setzt ihr die RG dann ins Minus oder Beides?

Ich bin da gerade etwas überfordert, wie ich das am Besten lösen soll.

Ich werde die RG neu ausdrucken, an den Rechnungsempfängerbrief anheften und eine neue RG erstellen mit neuer RG-Nummer.

Könnte es auch eine elegantere Lösung geben?

 

Vielen Dank schon mal für jegliche Tips und Anregungen.

 

Gruß, Kruna

26 Antworten

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

    Hallo Kruna, formal korrekt wäre wohl, eine Storno-Rechnung mit Minus-Betrag und dann eine neue Rechnung zu erstellen, beide mit jeweils eigener Rechnungsnummer. Dann stimmt das Kundenkonto und der Vorgang ist für das Finanzamt auch in ein paar Jahren noch nachvollziehbar.

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    HAllo Copytexter,

    vielen Dank für Deine Antwort. Und schon kommt die nächste Frage, wie erstelle ich eine StornoRg mit Minusbetrag?

    Die RG (es ist eine Teilrechnung) wurde aus einem Auftrag erstellt, bei den Du mir schon mal geholfen hast. Da hattest Du eine kleine DB 'Auftrag_zu_Rechnung' erstellt (Die war echt toll, hat mir ganz viel geholfen!!). Die Befehlsschaltfläche 'Rechnung erstellen' enthält folgendes Script:

     

    let myAF := this;
    let newRE := (create Rechnungen);
    newRE.(
    'Zu Auftrag' := myAF;
    'Zu Kunde' := myAF.'Zu Kunde';
    Kundennummer := myAF.'Zu Kunde'.Kundennummer;
    Name := myAF.'Zu Kunde'.Name;
    Ort := myAF.'Zu Kunde'.Ort;
    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)

     

    Ich habe das Script soweit angepasst und alles funktioniert prima! 

    Wie könnte ich denn da nun die StornoRg mit einbinden bzw. in Minus setzen?

     

    Vielen Dank und Gruß Kruna

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

    Ja, ich erinnere mich ... Da wurde per Skript aus einem Auftrag eine Rechnung erstellt. In diesem Fall haben wir die Rechnung schon und wollen sie im Grunde "nur" zwei mal duplizieren: Erstens für die Storno-Rechnung und zweitens für die neue, korrekte Rechnung. Denn inhaltlich ändert sich ansonsten ja nichts.

    In der einfachsten Form könnte man das einfach mit dem Ninox-Button "Datensatz duplizieren" in der Menüleiste machen, dann manuell die neue Rechnungsnummer eingeben und die Positionen manuell ins Minus setzen. Damit hätte man die Stornorechnung. Und für die neue, korrekte Rechnung könnte man den Duplizier-Vorgang wiederholen (ohne das Minus).

    Man muss auf der Rechnung allerdings auch vermerken, dass es sich um eine Storno-Rechnung handelt und auf welche ursprüngliche Rechnungsnummer sie sich bezieht. Ersteres habe ich bei mir mit einem Auswahlfeld für den Titel gelöst: "Rechnung" (Standard), "Korrekturrechnung", "Stornorechnung" (und weitere, aber die tun hier nichts zur Sache). Im Drucklayout wird automatisch das Entsprechende eingetragen. Weiterer Vorteil der Lösung mit dem Auswahlfeld: Man könnte anhand des Titels bei Bedarf noch weitere Aktionen auslösen (z. B.: if text(Titel) = "Stornorechnung" then ...).

    Für den Bezug gibt es bei mir ein gleichnamiges Textfeld, in dem normalerweise sowas steht wie "Ihr Auftrag vom ...", "Unsere Lieferung vom ..." oder ähnliches. Statt dessen könnte dort bei einem Storno halt stehen "Storno zu Rechnung XYZ vom ...".

    Es hängen also schon noch ein paar Details dran. Damit das hier nicht zu kompliziert wird, habe ich die vorhandene DB "Auftrag_zu_Rechnung" einfach mal aktualisiert und in der Tabelle 'Rechnungen' die o. g. Felder hinzugefügt, das Druckformular angepasst (Minimal-Infos) und zwei Schaltflächen erstellt. Eine zum Stornieren und eine zum Duplizieren der aktuellen Rechnung. Die zum Stornieren macht folgendes:

    1.) Der aktuelle Rechnungsdatensatz wird dupliziert.
    2.) Rechnungsnummer wird generiert und eingesetzt.
    3.) Rechnungsdatum wird auf den heutigen Tag gesetzt.
    4.) Titel wird auf "Stornorechnung" gesetzt.
    5.) Bezug wird auf die "alte" Rechnung gesetzt.
    6.) Beträge der Positionen werden ins Minus gesetzt.
    7.) Der neue Datensatz wird geöffnet.

    Die Punkte 1 bis 3 und 7 finden sich auch in der Schaltfläche zum Duplizieren.

    Die DB war jetzt eine relativ effektive Form, eine Möglichkeit der technischen Realisierung zu demonstrieren. Umsetzung und Anpassung müsstest du ggf. halt selbst vornehmen. Hier der neue Download-Link:

    https://www.dropbox.com/s/q5984e7xkaktzym/Auftrag_zu_Rechnung.ninox?dl=0

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Guten Morgen Copytexter,

     

    mir fehlen einfach die Worte!!! Nicht nur das Du die Lösung immer parat hast, sondern auch noch viel Input dazu schreibst. Das ist für mich, als Anfänger sehr hilfreich, Ninox besser zu verstehen. Ich kann zwar immer noch kein Script schreiben, aber jedesmal denke ich mir 'Ja klar, wie denn auch sonst!'

    Tausendmal unendlich Danke!!! Ihr seid hier echt alle Klasse und immens hilfsbereit!

     

    Nach ein paar Anpassungen und nachdem ich ein wenig 'herumprobiert' habe, funktioniert alles perfekt!

     

    Es ist mir zwar ein wenig unangenehm , noch einmal nachzufragen, aber der Vollständigkeit halber frage ich doch nochmal. Wie würde denn das Script lauten, wenn es sich nur um eine Korrekturrechnung handelt?

    Entschuldige, dass ich da nochmal nachfrage.

     

    Gruß

    Kruna

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

    Ich bin auch kein Experte in Sachen Buchhaltung, deshalb ohne Gewähr: Korrekturrechnungen braucht man nicht unbedingt. Sie sind im Grunde das, was früher als "Gutschrift" bezeichnet wurde, weil dieser Begriff seit 2013 steuerrechtlich anders definiert wird. Wenn bspw. auf der Rechnung 20 Stück eines Artikels berechnet, aber nur 15 geliefert wurden, dann kann man dem Kunden für die 5 zuviel berechneten eine Korrekturrrechnung mit Minus-Werten erstellen. Das setzt allerdings voraus, dass die Ursprungsrechnung ansonsten formal korrekt und vollständig war. Und auch bei einer Korrekturrechnung muss eindeutig vermerkt sein, welche Rechnung mit dieser korrigiert wird. Man hat am Ende also zwei Dokumente für denselben Vorgang: Die usprüngliche, falsche Rechnung und die Korrekturrechnung.

    Eine fertige Korrekturrechnung lässt sich auf Knopfdruck also nicht erstellen, weil ja nicht klar, WAS korrigiert werden soll. Man muss also immer noch "Hand anlegen" und die betreffenden Bestandteile manuell ändern. Also bei obigem Beispiel die Menge der Position auf -5 setzen und alle anderen Positionen löschen. 

    Man kann die erste Rechnung aber auch komplett stornieren und eine neue Rechnung ausstellen. Das geht immer. In deinem Beispiel mit der falschen Adresse wäre das m. E. sogar erforderlich, weil die erste Rechnung ja nicht korrekt war und evtl. vom Finanzamt nicht anerkannt würde. Dann hat man am Ende drei Dokumente: Die usprüngliche, falsche Rechnung, die Stornorechnung und die neue, korrekte Rechnung. Das ist wohl die sauberste und transparenteste Lösung.

    Wichtig ist: Jede Rechnung, auch Korrektur- und Stornorechnung, benötigt eine neue, eindeutige Rechnungsnummer. Und solange eine Rechnung noch nicht versendet und gebucht wurde, kann man sie natürlich auch direkt ändern.

    Aber wie gesagt: Alle Angaben ohne Gewähr. Hier geht es weniger um technische als um sachliche bzw. rechtliche Fragen. Im Zweifelsfall also lieber selbst noch mal recherchieren oder einen Steuerberater befragen.

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

    Ach so, wenn du dir trotzdem eine Schaltfläche für Korrekturrechnung erstellen, die Rechnung damit duplizieren und alle Positionen ins Minus setzen willst, dann kannst du im Grunde den Code der "Storno"-Schaltfläche nehmen und geringfügig anpassen:

     

    let Antwort := dialog("Rechnungskorrektur", "Wollen Sie eine Korrekturrechnung zu dieser Rechnung erstellen?", ["Ja, mach hinne", "Nää, lieber nicht"]);
    if substr(Antwort, 0, 1) = "J" then
        let oldRe := this;
        let myDatum := today();
        let y := year(myDatum);
        let c := cnt(select Rechnungen where year(myDatum) = y) + 1;
        let newRe := duplicate(this);
        newRe.(Rechnungsnummer := "RE-" + format(y, "00") + "/" + format(c, "0000"));
        newRe.(Rechnungsdatum := today());
        newRe.(Rechnungstitel := "Korrekturrechnung");
        newRe.(Bezug := "zu Rechnung " + oldRe.Rechnungsnummer + " vom " + oldRe.Rechnungsdatum);
        for i in newRe.RE_Positionen do
            i.(Betrag := i.Betrag * -1)
        end;
        openRecord(newRe)
    end

      • Ines
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Moin  , 

      ich war so frei mich ebenfalls an deiner Formel zu bedienen und muss sagen, dass diese mir schon eine Menge arbeitet erspart hat! 🙂
      Allerdings komme ich bei kleinen Abwandlungen nicht weiter... Zum einen habe ich 2 Tabellen mit Rechnungspositionen; bei der ersten funktioniert die Schleife wunderbar und kopiert die Positionen als Minus-Positionen in die neue "Storno-Rechnung". Bei der zweiten Tabelle funktioniert das leider nicht. 

      Außerdem würde ich bei der zu stornierenden Rechnung in dem Zuge auch gerne ein Storno-Datum eintragen und den Status auf "storniert" ändern, wenn ich das aber in die Formel einbaue, funktioniert der Rest nicht mehr🙈

      Hast du vielleicht noch einen guten Tipp für mich? 

      Hier mal mein kläglicher Versuch, meine Wünsche in die bis dato gut funktionierende Formel zu integrieren. 

      let Antwort := dialog("Storno", "Wollen Sie diese Rechnung wirklich stornieren?", ["Ja", "Nein"]);
      if substr(Antwort, 0, 1) = "J" then
                  let oldRe := this;
                  let newRe := duplicate(this);
                  oldRe.(Status := "Storniert");
                  oldRe.('Storno Datum' := today());
                  newRe.('RG-Nr.' := last(((select Rechnung) order by 'RG-Nr.').'RG-Nr.') + 1);
                  newRe.('RG-Datum' := today());
                  newRe.(Status := "Stornobeleg");
                  newRe.(Bezug := "zu Rechnung " + oldRe.'RG-Nr.' + " vom " + oldRe.'RG-Datum');
                  for i in newRe.'A. Zeitaufwand (§§8,9)' do
                              i.(Menge := i.Menge * -1);
                              for p in newRe.'B. Auslagen- und Aufwendungsersatz (§§5-7,9)' do
                                         p.(Menge := p.Menge * -1)
                              end
                  end;
                  openRecord(newRe)
      end

       

      Gruß, Ines

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

       

      Hallo Ines, es freut mich, dass dir mein Script geholfen hat. Zu deinem aktuellen Problem:

      Wenn ich es richtig sehe, dann sind 'A. Zeitaufwand (§§8,9)' und 'B. Auslagen- und Aufwendungsersatz (§§5-7,9)' quasi "gleichberechtigte" Untertabellen von 'Rechnungen'. Sie müssten dann auch auf die gleiche Weise abgearbeitet werden. Also jeweils in einer eigenen Schleife. Ich würde es mal so versuchen:

      [...]
         for i in newRe.'A. Zeitaufwand (§§8,9)' do
            i.(Menge := i.Menge * -1)
         end;
         for p in newRe.'B. Auslagen- und Aufwendungsersatz (§§5-7,9)' do
            p.(Menge := p.Menge * -1)
         end;
         openRecord(newRe)
      end
      • Ines
      • vor 1 Jahr
      • Gemeldet - anzeigen

       

      Genau, das sind zwei gleichberechtigte Tabellen. Trotz der kleinen Änderungen, funktioniert die Formel nur bei 'A. Zeitaufwand (§§8,9)'. Selbst wenn ich diese Schleife lösche und nur die für die zweite Tabelle 'B. Auslagen- und Aufwendungsersatz (§§5-7,9)' laufen lassen, funktioniert sie nicht mehr. 
      Das ist doch ziemlich merkwürdig. 

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

       

      Sehr merkwürdig, in der Tat. Ich habe die Konstellation gerade auf die Schnelle mal in einfacher Form nachgestellt. Und bei mir funktioniert es jetzt gar nicht, weder mit TabelleA noch mit TabelleB. Jedenfalls nicht, wenn ich auf die ID in 'newRE' Bezug nehme:

      newRE.PositionenA.(Menge := Menge * -1);
      

      Bei direkter Adressierung im Datensatz hingegen funktioniert es:

      PositionenA.(Menge := Menge * -1);
      

      Mit for-Schleife genau dasselbe. Ich bin im Moment offen gestanden auch etwas ratlos. Vielleicht habe ich gerade Tomaten auf den Augen und übersehe irgendwas. Kommt ja vor. Muss ich mir später noch mal in Ruhe ansehen.

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Manchmal dauert's etwas länger (das Alter, die Hitze) ...

      Wenn man den Wert von 'Menge' in eine Variable schreibt und die Rechenoperation dann mit dieser ausführt, funktioniert's:

      for i in newRE.'A. Zeitaufwand (§§8,9)' do
          let myM := i.Menge;
          i.(Menge := myM * -1)
      end;
      for i in newRE.'B. Auslagen- und Aufwendungsersatz (§§5-7,9)' do
          let myM := i.Menge;
          i.(Menge := myM * -1)
      end;
      

      Warum das andere nicht funktioniert hat, bzw. bei dir nur mit einer Tabelle, kann ich leider nicht genau sagen. Dem muss ich noch mal auf den Grund gehen. Aber wie gesagt: Der obige Code sollte eigentlich auch bei dir sicher funktionieren.

      • Ines
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Guten Morgen  ,
      erstmal vielen Dank für deinen Einsatz und deine Mühe. 

      Es ist wirklich wie verhext, aber es funktioniert nach wie vor nur mit der ersten Tabelle. 
      Grundsätzlich ist das ja nicht wahnsinnig schlimm und ich muss die Daten dann eben händisch nachtragen, aber verstehen tue ich das nicht... 
      Hast du vielleicht aber noch eine Idee, wie ich gleichzeitig in dem "alten Datensatz" 2 Änderungen vornehmen kann? Ich würde gerne den Status (einfaches Auswahlfeld) und das Storno-Datum eintragen. 
      Wenn ich das relativ an den Anfang der Formel setze, greift diese nicht mehr bezüglich des neuen Datensatzes.

      Wenn ich das nach den beiden for Schleifen einsetze, passiert gar nichts... 
      Vielleicht liegt es ja bei mir auch nur an der Hitze...

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

       "Wie verhext" trifft es gut ...

      Ich sehe da keinen Fehler. Das, was du erreichen willst, sollte mit dem Code auch funktionieren. Sowohl die Zuweisungen in 'oldRe' als auch die Minus-Berechnungen in den 'newRe'-Untertabellen. Und in meinem nachgestellten Szenario funktioniert es auch.

      Ich würde die oldRe-Zuweisungen für Status und Storno-Datum zwar vor dem "duplicate" platzieren, aber nur der Übersichtlichkeit halber. Technisch spielt die Reihenfolge keine Rolle. Wenn die Variablen mit den IDs einmal definiert sind, kann man darüber innerhalb des Scriptes jederzeit auf die betreffenden Datensätze zugreifen.

      Insofern habe ich so aus der Ferne gerade keine Idee mehr, was man noch probieren könnte. Um der möglichen Ursache des Problems evtl. auf die Spur zu kommen, müsste man mal direkt in die Datenbank schauen. Vielleicht kannst du ja eine Kopie mit ein paar Demodaten machen und sie hier hochladen. Oder mir per E-Mail an post@planox.pro zukommen lassen Dann schaue ich gerne mal rein.

      Ansonsten bliebe nur der Support. Es sei denn, jemand anderes, der hier mitliest, hätte noch eine Idee.

      • mirko3
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Auch ich habe in diesem Fall keine Lösung, aber manchmal hat mir die zeilenweise Analyse mit debugValueInfo() geholfen einem Fehler auf die Spur zu kommen. Vielleicht erkennt man dann, wo fehlerhafte Bedingungen bestehen, die dann weitergegeben werden. Das Array aus einer Schleife kann auch einzeln geprüft werden z.B. debugValueInfo(newRe.'A. Zeitaufwand (§§8,9)' . Aber ominös bleibt es allemmal. Oder Scripte funktionieren doch temperaturabhängig... Gruß Mirko

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Hallo Mirko, danke für deinen Tipp! Ich bin dem Fehler aber schon auf der Spur. Auflösung in Kürze.

      • Ines
      • vor 1 Jahr
      • Gemeldet - anzeigen

        Vielen Dank euch beiden für die Unterstützung! Ich bin wirklich gespannt auf die Lösung. 

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Ines hatte mir ihre Datenbank zukommen lassen. Und so ließ sich die Ursache des Problems recht schnell finden: Es waren nämlich nicht wie angegeben zwei "gleichberechtigte Untertabellen ", sondern lediglich zwei unterschiedlich benannte Verknüpfungen auf ein und dieselbe Untertabelle namens 'Positionen'. Das ist natürlich ein großer Unterschied.

      Wobei Ninox es ja zulässt, dass man eine Tabelle mehrfach mit einer anderen verknüpft. Insofern hätte man durchaus erwarten können, dass dies dann auch beim duplicate() berücksichtigt wird. Es ist aber so, dass in einem solchen Fall - auch anders als auf Rückfrage angegeben - die zweite Verknüpfung offenbar gar nicht in den duplizierten Rechnungs-Datensatz übernommen wird (gilt auch für die "Duplizieren"-Schaltfläche in der Ninox-Menüleiste oben rechts) . Man kann das m. E. in gewisser Weise durchaus als Bug bezeichnen. Der wahrscheinlich bisher nur noch nicht aufgefallen war, weil solche Konstellationen eher selten vorkommen.

      Jedenfalls: Wenn die Verknüpfung leer ist, gibt es natürlich auch keine Mengen, die ins Minus gesetzt werden könnten. Die zweite for-Schleife für Tabelle 'B.' lief also praktisch ins Leere.

      Nahe liegende Lösung: Aus der einen Untertabelle einfach zwei machen. Zwillinge quasi, mit denselben Datenfeldern. Für den Nutzer macht das keinen Unterschied, Ablauf und Bedienung bleiben exakt gleich. Nur, dass die Positionen dann eben in zwei verschiedenen Untertabellen gespeichert sind. Was u. U. ja sogar von Vorteil sein kann (gefilterte Auswahl der Artikel/Leistungen). Ob es auch praktische Nachteile hat, hängt wohl vom Einzelfall ab. Ich sehe aber erst mal keine.

      Man könnte aber wohl auch bei einer Untertabelle bleiben und in dieser ein Merkmal zur Unterscheidung zwischen A- und B-Positionen einbauen (z. B. mittels Auswahlfeld). Dann ließen sich die Typen innerhalb der einen (1) Verknüpfung unterscheiden. Im Drucklayout könnte man die Verknüpfung dann wieder zwei mal abbilden und jeweils entsprechend filtern, so dass in der einen nur Einträge vom Typ A angezeigt würden und in der anderen nur Typ B.

      So oder so: Da es in den Positionen aktuell offenbar noch kein Merkmal zur Unterscheidung nach A oder B gibt, dürfte eine nachträgliche, automatisierte Zuordnung der betreffenden, bereits vorhandenen Datensätze schwierig werden. Man müsste dazu wohl ein Script erstellen, das prüft, ob die Verknüpfung in A oder B vorgenommen wurde und ggf. neu verknüpfen.

      PS: Ach so, die Zuweisung von Status = "Storniert" und Storno-Datum in der alten Rechnung hat einwandfrei funktioniert. Keine Ahnung, warum das bei Ines nicht geklappt hat. Vielleicht war das aber auch ein Missverständnis.

      PPS: Meine Hinweise auf falsche Angaben bei der Problembeschreibung sind nicht als Vorwurf an Ines zu verstehen, sondern als Hinweis auf die entscheidende Bedeutung der Antworten auf Rückfragen. Anders gesagt: Je genauer der Input, desto größer die Wahrscheinlichkeit, dass ein Problem zeitnah gelöst werden kann.😉

      • Ines
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Vielen Dank für deine ausführliche Beschreibung und sorry für die missverständliche Problembeschreibung. 
      Ich hab jetzt mich für deinen ersten Lösungsvorschlag entschieden und eine zweite Untertabelle erstellt. Damit klappt es jetzt auch!!
      Allerdings habe ich nach wie vor das Problem, wenn ich die Änderungen für den "alten Datensatz" in die Formel einbaue, wird dieser zwar wie gewünscht geändert, in dem neuen Datensatz erscheint dann aber nur noch die neue Rechnungsnummer und alle anderen Felder bleiben leer. 

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Hm ... Poste doch bitte noch mal das Script, so wie es jetzt ist.

      • Ines
      • vor 1 Jahr
      • Gemeldet - anzeigen

       bei diesem Script, wird der Status in dem alten Datensatz auf "Storniert" gesetzt und ein Storno Datum eingetragen. Allerdings wird danach nur ein neuer Datensatz geöffnet, die Rechnungsnummer eingetragen und das wars, alle anderen Felder (Kunde, Projekt, Rechnungspositionen, Datum, etc.) bleiben leer.

      bei diesem Script bleibt der alte Datensatz eben unverändert, dafür funktioniert das kopieren in den neuen Datensatz mit den auf Minus gesetzten Positionen hervorragend. 

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Ah, okay. Schau doch bitte mal, ob bei den Feldern 'Status' und/oder 'Storno Datum' Änderungstrigger hinterlegt sind, und entferne sie testweise. Danach probiere es noch mal mit dem oberen Script. Falls es dann funktioniert, solltest du prüfen, ob die Trigger tatsächlich erforderlich sind bzw. wie die entsprechenden Aktionen alternativ ausgeführt werden könnten (z. B. im Storno-Script).

      • Ines
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Perfekt, das war's!! Ich hatte noch einen Änderungstrigger für den Schreibschutz hinterlegt. Den habe ich jetzt einfach in das Script mit eingebaut und es läuft!!

      Nochmal vielen vielen Dank! Das hätte ich alleine so nie hinbekommen!

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Copytexter,

     

    das hat auch wunderbar geklappt!! Viiiiielen Dank nochmals!

    Wahrscheinlich werde ich die Korrektur eh nicht brauchen, aber wenn, dann kann ich doch darauf zugreifen.

    Und wie Du auch schreibst, es sind vielmehr sachliche Fragen, die mir dann eher ein Steuerberater beantworten kann. Trotzdem vielen Dank.

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    HAllo Copytexter,

     

    entschuldige mich bitte, aber ich habe eine Frage zu deiner Beispieldatenbank. Es hat alles super funktioniert und tut es auch weiterhin.

    Nun ist aber folgendes eingetreten:

     

    Es gibt keinen Auftrag, sondern gleich eine Rechnung an Kunde XY.

    Bildschirmfoto 2020-09-17 um 14.13.38

    Wie man nun oben rechts sehen kann, sind noch -876,00€ offen. Wie bekomme ich das auf 0,00€? Ich habe einiges mit if then versucht, aber es hat leider nicht geklappt.

     

    Vielen Dank im Voraus!

     

    Gruß Kruna

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

    Hallo Kruna, die Ausgangssituation damals war ja, dass jeder Rechnung ein Auftrag zugrunde liegt. Mit dem Berechnungfeld "Offen" sollte ermittelt werden, ob es noch nicht berechnete Aufträge gibt. Die Formel war entsprechend simpel:

    'Sum Aufträge' - 'Sum Rechnungen'

    Wenn man nun auch Rechnungen ohne vorherigen Auftrag erstellt, dann funktioniert das natürlich nicht mehr. Das Ergebnis einfach auf Minus abzufragen und ggf. auf 0 zu setzen, wäre auch keine Lösung, weil der Sinn des Feldes nicht mehr sicher erfüllt würde (z. B. wenn tatsächlich ein Auftrag offen ist und eine Rechnung ohne Auftrag für diesen Kunden erstellt wurde).

    Aber in den Aufträgen gibt es ja auch das Feld 'Offen'. Das ist für diesen Zweck im Grunde ja sowieso viel besser geeignet. Also am besten in der Ansicht "Aufträge" auch die Spalte "Offen" einblenden und die Formel im Kundenformular ändern:

     

    sum('Aufträge'.Offen)

    Vielleicht sollte man bei der Gelegenheit auch die Felder neu anordnen und/oder neu benennen, damit klar ist, dass sich der Betrag im Feld "Offen" auf die Auträge bezieht und nicht auf die Rechnungen. Das aber nur nebenbei.

     

    NX_Kruna01