Automatisches abfragen bereits geleisteter Zahlungen
Ich habe ein kleines Problem mit meiner Datenbank. Ich habe zu unserem Hausbau eine kleine Auftragsverwaltungsdatenbank gebastelt. Nun habe ich folgende Problem:
In der Rechnungsverwaltung ist es mir unter den einzelnen Aufträgen nicht möglich, bereits geleistete Zahlungen, bei Erstellung einer neuen Abschlagszahlung, automatisch abzufragen. Hier muss ich die geleisteten Zahlungen immer händisch eintragen. Hat jemand einen Lösungsvorschlag?
Ich wäre euch sehr dankbar.
12 Antworten
-
Hallo, um eine Lösung zu finden müsste man erst mal das Problem verstehen. Dazu wäre (zumindest in meinem Fall) etwas mehr Kontext erforderlich.
Wie sind die Daten strukturiert? Wo soll wann welches Feld aus welcher Tabelle automatisch abgefragt werden?
-
Entschuldigung für die etwas unklare Beschreibung.
Die Datenbank der Rechnungsprüfung ist wie folgt aufgebaut:
# Zu einem Gewerk werden jeweils mehrere Abschlagszahlungen und schlussendlich die Schlusszahlung eingereicht.
- Rechnungsbetrag geprüft
- Rechnungsbetrag geprüft abzgl. bereits geleistete Zahlungen--> Rechnungsbetrag
- Von dem anerkannten Rechnungsbetrag werden nun noch Skonto und Nachlass (Abfrage aus Auftrag) abgezogen.
Nun hätte ich gerne, dass mit Erstellung einer neuen Abschlagszahlung, die bereits vorher geleisteten Zahlungen automatisch herangezogen werden und diese nicht immer händisch ermittelt werden müssen. Sodass ich bei einer Rechnung nur noch den geprüften Rechnungsbetrag eintragen muss.
Hier bekomme ich nach meinem jetzigen Vorgehen immer eine Fehlermeldung einer unzulässigen Schleife. In dem Feld bereits geleistete Zahlungen frage ich die Summe der bisherigen geleisteten Zahlungen des Auftrages ab. Durch Freigabe der neuen Rechnung würde sich dieser Wert erhöhen und so kommt diese unzulässige Schleife zustande. Meine Kenntnisse gehen leider noch nicht über die visuelle Programmierung heraus, sodass ich hier an meine Grenzen gestoßen bin und mich zum jetzigen Zeitpunkt mit der händischen Eintragung der geleisteten Zahlungen angefreundet habe.
Heute Abend kann ich zur besseren Verdeutlichung mal noch ein Screnshoot hochladen.
-
Danke für die Erläuterung. Was mir persönlich zum Verständnis noch fehlt, sind Informationen zur Datenstruktur. Reden wir über eine einzige Tabelle, in der bspw. jeweils Gewerk, Rechnungsnummer, Datum und Betrag gespeichert werden? Oder gibt es verschiedene Tabellen, die miteinander verknüpft sind (z. B. eine für Rechnungen und eine für Zahlungen)?
Last not least: Wie sieht der Code aus, der die Fehlermeldung erzeugt, und wann wird er wo ausgeführt (Trigger, Funktionsfeld, Schaltfläche)?
Aber okay, gehen wir mal beispielhaft von einer einzigen Tabelle namens RECHNUNGEN mit folgenden (relevanten) Datenfeldern und Summenbildung nach Gewerk aus:
Gewerk (Auswahlfeld; z.B.: Dach | Sanitär | Elektro | ... o.ä.)
Bereits gezahlt (Funktionsfeld)
RechNr (Textfeld)
RechDatum (Datumsfeld)
Betrag (Zahlenfeld)
Status (Auswahlfeld; z.B.: eingegangen | geprüft | bezahlt | ... o.ä.)
Dann könnte man beim Erfassen einer neuen Rechnung (= Anlegen eines neuen Datensatzes) die Summe früherer Zahlungen zum jeweiligen Gewerk im Funktionsfeld 'Bereits gezahlt' wie folgt ermitteln:
let myGewerk := Gewerk;
let myNr := number(Nr);
sum((select Rechnungen where Gewerk = myGewerk and number(Nr) < myNr).Betrag)
Der Filter ließe sich auch noch um ein weiteres Kriterium wie den Status erweitern:
let myGewerk := Gewerk;
let myNr := number(Nr);
sum((select Rechnungen where Gewerk = myGewerk and number(Nr) < myNr and text(Status) = "bezahlt").Betrag)
Nur so als Idee. Das Beispiel ist jetzt natürlich von mir konstruiert, aber vielleicht hilft es ja trotzdem auf die Sprünge. Ansonsten einfach noch mal konkret nachfragen.
-
Danke für die Antwort, werde es heute Abend mal versuchen zu realisieren.
Zu der Struktur der Tabellen:
Es existieren mehrere Tabellen.
1. Tabelle Projektübersicht, gegliedert nach den Kostengruppen 100-700
2. Untertabelle mit den einzelnen Aufträgen
3. Eigenständige Rechnungstabelle, verknüpft mit den vorgenannten Tabellen.
-
Leider bekomme ich das Problem nicht wirklich gelöst. Ich versuche das Problem nun mal über einige Screenshots zu erläutern:
- So sieht das Datenmodell aus
- Auftragstabelle
-Rechnungstabelle
- Und zu guter Letzt mein versuch das Problem zu lösen
-
Auf die Schnelle: Ursache des Syntaxfehlers in Zeile 3 ist sehr wahrscheinlich das Komma. Und auch die Klammern sind augenscheinlich nicht richtig gesetzt. Ich sehe da zwei öffnende und drei schließende. Abgesehen von den sonstigen Angaben sollte die Grundstruktur der "sum"-Funktione so aussehen:
sum((select TABELLE where BEDINGUNG).DATENFELD)
Den Rest schaue ich mir später noch mal genauer an (sofern nicht vorher jemand anderes tut und das Problem löst).
-
Alsooo ... Das ist für mich echt schwierig zu interpretieren, aber wenn ich mal davon ausgehe, dass in der Tabelle RECHNUNG im Funktionsfeld 'Bereits gezahlt' automatisch alle vorherigen Werte des Feldes 'Forderung' zu diesem Auftragnehmer summiert werden sollen, dann könnte die Formel im Feld 'Bereits gezahlt' so aussehen:
let myNr := number(Nr);
let myAN := Auftrag.Auftragnehmer;
sum((select Rechnung where Auftrag.Auftragnehmer = myAN and number(Nr) < myNr).Forderung)Die verschiedenen Feld-Varianten für Netto, Brutto usw. habe jetzt mal außen vor gelassen, das sie für die Logik keine Rolle spielen. Man müsste ggf. also in der sum()-Funktion den Feldnamen 'Forderung' noch durch den Namen des tatsächlich zu summierenden Feldes austauschen (z. B. 'Bezahlt inkl. Skonto [brutto] ').
Grundsätzlich würde ich empfehlen, Feldnamen nicht zuuu lang zu machen (Alternativen zur Erläuterung: Die Gestaltungslemente "Überschrift" und "Freitext") und Felder gleichen Inhalts auch gleich zu benennen ("Auftragnehmer" vs. "Auftrag"). Sonst blickt man selbst irgendwann nicht mehr durch, geschweige denn andere.
-
Danke für die Info, habe das ganze jetzt mal integriert, leider funktioniert das ganze so nicht, da die Rechnungen summiert ausgestellt werden.
Zur Verdeutlichung:
-1. AZ Forderung 5.000 €-->Zahlbetrag=5.000 € (bereits gez.=0€)
-2. AZ Forderung 10.000 € --> Zahlbetrag=5.000 € (bereits gez.=5.000€)
-3. AZ Forderung 15.000 €--> Zahlbetrag=5.000 € (bereits gez.=10.000€)
Aus meinem Verständnis müsste die Formel wie folgt lauten:
let myNr := number(Nr);
let myAN := Auftrag.Auftragnehmer;
sum((select Rechnung where Auftrag.Auftragnehmer = myAN and number(Nr) < myNr).'Rechnungsbetrag [netto]')Hier bekomme ich nun folgende Fehlermeldung: Die Formel ist ungültig: Internal Error: Too Much recursion
-
Prinzipiell sieht die Formel für mich richtig aus. Allerdings scheint 'Rechnungsbetrag [netto]' selbst ein Formelfeld zu sein und zeigt im Screenshot ein leeres Ergebnisfeld. Wie sieht denn die Formel/der Code in diesem Feld aus? Vielleicht steht da wieder eine Verknüpfung drin, die Ninox in der Summe überfordert?
Versuche doch mal testweise die sum()-Funktion mit irgend einem anderen Feld, in das du direkt einen Wert geschrieben hast, z. B. 'Forderung [netto]'. Nur um zu sehen, ob es an dem Bezugsfeld liegt oder ob der obige Code generell falsch ist.
Ansonsten bin ich da jetzt auch überfragt. Vielleicht hat noch jemand anders eine Idee oder sieht was, was ich nicht sehe?
-
Danke für die erneut schnelle Antort!
Die Formel ansich funktioniert mit dem Einsatz von 'Forderung [netto]'.
Es ist auch korrekt, dass es sich bei Feld 'Rechnungsbetrag [netto]' um ein Funktionsfeld handelt, hier ist folgende Formel hinterlegt: 'Rechnungsbetrag geprüft [netto]' - 'Bereits gezahlt [netto]'
Besteht eventuell eine Möglichkeit das Ergebnis von 'Rechnungsbetrag geprüft [netto]' in ein Zahlenfeld schreiben zu lassen und dieses in der Formel 'Bereits gezahlt [netto]' abzufragen?
-
Okay, dann sind wir ja schon mal einen Schritt weiter. Offen gestanden blicke ich aber auch bei den unzähligen Berechnungsfeldern ähnlicher Bedeutung nicht mehr ganz durch. Kann es sein, dass es dir ähnlich geht?
Ursprünglich ging es ja darum, beim Anlegen einer neuen Rechnung alle bisherigen Zahlungen(!) an diesen Auftragnehmer zu summieren. Dazu muss man halt schauen, wo, also in in welcher Tabelle und in welchem Feld dieser zu summierende Zahlungsbetrag steht.
Das betreffende Feld kann zwar prinzipiell auch ein Berechnungsfeld sein, aber wenn dessen Formel
'Rechnungsbetrag geprüft [netto]' - 'Bereits gezahlt [netto]'
lautet, dann kommen mir starke Zweifel, dass das Ergebnis für die eigentliche Berechnung der Gesamtsumme aller bisherigen Zahlungen überhaupt relevant sein kann.
Nehmen wir an, 'Rechnungsbetrag geprüft' wäre 1000 Euro, 'Bereits gezahlt' 800 Euro. Dann wäre das Ergebnis der Formel 200 Euro. Und diese 200 würden auch zur Summierung herangezogen. Das kann ja nicht richtig sein. Oder soll doch ganz was anderes berechnet werden?
Kurzum: Ich sehe hier weniger ein technisches Problem, sondern mehr ein inhaltlich-strukturelles. Vielleicht sollte man das ganze Konstrukt noch mal sachlich überdenken, alles rauschmeißen, was nicht unbedingt erforderlich ist, und dann erst mal die Basisfunktionalität aufbauen. Mit eindeutigen Feldnamen und klarer Struktur. Erweitern und verschönern kann man hinterher immer noch.
Mehr kann ich im Moment leider nicht dazu sagen, tut mir leid. Aber vielleicht wäre es sinnvoll, das Problem mal "live" im Webinar zu behandeln. Das findet immer mittwochs ab 16 Uhr statt. Anmelden kann man sich hier:
-
Da es fortlaufende Rechnungen sind, welche mit Baufortschritt fortgeschrieben werden, ist die Formel so korrekt. Das war es was ich einige Posts davor versucht habe zu verdeutlichen.
Wie in deinem Beispiel aufgeführt wäre es so korrekt. Wenn z.B. In der ersten Abschlagszahlung 800 € anerkannt wurden, würden nun noch bei 1000€ Rechnungssumme, 200 € anerkannt werden und zur weiteren Berechnung, also Abzug von Skonto, Nachlass, etc. berücksichtigt werden.
Content aside
- vor 6 JahrenZuletzt aktiv
- 12Antworten
- 4190Ansichten