0

Daten aus vorheriger Rechnung anzeigen

Liebe Leute,

da ich im Forum keine Lösung gefunden habe, hier mein Problem:
Ich möchte in der aktuellen Rechnung an einen Kunden jeweils anzeigen lassen, welche Rechnungsnummer seine letzte Rechnung hatte und wie hoch der Rechnungsbetrag war.

Dazu gibt es die Felder:

'Invoice #' -> Hier werden die Rechnungen pro Kunde fortlaufend von 1 ab aufaddiert

Rechnungsnummer -> Textfeld, in dem die Rechnungsnummer eingetragen ist, z. B. 21-105

Rechnungsbetrag -> Formelfeld, in dem die Summe der Positionen der jeweiligen Rechnung addiert wird.

Soweit bin ich bislang gekommen:

let myActualInvoice := this;
let myPreviousInvoice := MyActualInvoice - 

Und dann hörts auf ...

Was ich ninox sagen will: myPreviousInvoice soll sein das 'Invoice #' von myActualInvoice minus 1.

Wenn das berecnet ist, dann bitte anzeigen Rechnungsnummer und Rechnungssbetrag von MyPrevoiusInvoice.

 

Ist vermutlich einfach, wenn man weiß wie's geht ...

Danke und einen schönen Sonntag

ali

9 Antworten

null
    • T_Bartzsch
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hi Ali, die Hälfte ist ja schon richtig. Du musst frei übersetzt sagen:

     

    Meine aktuelle Rechnung = Diese hier;

    Meine vorige Rechnung = Diese hier - 1

    Wähle aus der Tabelle Rechnungen den Datensatz, welcher als Nr die Nummer dieses Datensatzes - 1 hat und zeige mir daraus das Feld Rechnungsnummer (bzw. Rechnungsbetrag)

     

    Auf "Ninox" wäre das dann:

     

    let myID := number(this);

    let myPrevID := myID -1;

    first(select DEINETABELLERECHNUNGEN [Nr = myPrevID]).Rechnungsnummer

     

    zeigt Dir dann im Funktionsfeld die Rechnungsnummer.

     

    Oder Du konstruierst Dir beides in eine Textzeile

    ...

     

    "Vorige Rechnung: " + first(select DEINETABELLERECHNUNGEN [Nr = myPrevID]).Rechnungsnummer + " - Betrag: " + first(select DEINETABELLERECHNUNGEN [Nr = myPrevID]).Rechnungsbetrag

    • Ali
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Lieber T.,
    allerbesten Dank für die Erläuterungen, die sogar ein Laie wie ich versteht ;-)
    Allerdings gibts da einen Haken: Wenn ich es recht sehe, bezieht sich "number(this)" auf die automatisch von Ninox vergebene laufende Nummer, richtig? Das funktioniert nicht, da die Datensätze nicht chronologisch in die Datenbank eingegeben worden sind. Kurz: Das Ergebnis ist nicht die vorige Rechnung, sondern der zuvor eingebenen Datensatz.

    Um die Rechnungen des jeweiligen Kunden chronologisch zu ordnen, hab ich sie händisch von 1 bis ultimo durchnummeriert und zwar in dem Feld 'Invoice #'. Ich habe es versucht, aber nicht geschafft ninox zu sagen, dass "this" sich auf dieses Feld 'Invoice #' beziehen soll. (Man könnte sicherlich auch anhand des Rechnungsdatums eine chronologsche Sortierung einfügen und würde sich dadurch die fehleranfällige händische Eingabe sparen. Nicht?)

    let myID := 'Invoice #'(this)
    liefert genauso eine Fehlermeldung wier alle anderen Varianten die ich ausprobiert habe bzw. sie liefern gar kein Ergebnis.

    Was mache ich falsch?

    Danke und schöne Grüße
    ali

    • T_Bartzsch
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Ja, dann ist auch die ID des aktuellen Datensatzes unwichtig, da man ja über "-1" wirklich nur auf den vorher generierten Datensatz kommt.

    Du hast also nicht pro Kunde eine Untertabelle mit all seinen Rechnungen, sondern alle Rechnungen in einer Tabelle, wo dann Nr 12 Kunde Meier, Nr 13 Kunde Jackson und Nr 14 Kunde Güngör ist?

    In diesem Falle brauchst Du den Kunden (oder die Kundennummer) als Suchbedingung und sortierst nach Rechnungsnummer

    let myKunde := KUNDENNAME // (oder KUNDENNUMMER) //;

    last(select RECHNUNGEN [KUNDENNAME = myKunde] order by 'Invoice #').'Invoice #'

     

    Du kannst ja deine Ansichten auch nach Rechnungsdatum sortieren, bzw nach Rechnungsnummer - das sollte die Fehlerquote bei der händischen Vergabe senken. Oder Du erstellst Dir über eine Formel in einem Button automatisiert eine neue Rechnung mit bereits ausgefüllter Rechnungsnummer und dem Erstellungsdatum usw. Das geht alles ... 

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

    Hallo, wenn 'Invoice #' ein Zahlenfeld ist, könnte man es auch so versuchen:

     

    let myPrevInvoiceNr := 'Invoice #' - 1;
    let myPrevInvoice := first(select Rechnungen where 'Invoice #' = myPrevInvoiceNr);
    myPrevInvoice.Rechnungsnummer + ", " + myPrevInvoice.Text(Rechnungsbetrag)

     

    Wenn 'Invoice #' ein Textfeld ist, das nur Ziffern enthält, muss es vor und nach der Berechnung umgewandelt werden:

     

    let myPrevInvoiceNr := text(number('Invoice #') - 1);
    ...

     

    Grüße, Axel

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

    Ups, Korrektur letzte Zeile ("text" muss kleingeschrieben werden):

     

    myPrevInvoice.Rechnungsnummer + ", " + myPrevInvoice.text(Rechnungsbetrag)

    • Ali
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Lieber T., lieber Axel,

    super, das war sehr hilfreich. So langsam schein ich das mit den Variablen zu verstehen.

    Das funktionierende Skript sieht un so aus:

    let myActInvoice := 'Invoice #';
    let myPrInvoice := myActInvoice - 1;
    "Rn. Nr.: " + last((select Rechnungen)['Invoice #' = myPrInvoice]).Rechnungsnummer + " vom " + last((select Rechnungen)['Invoice #' = myPrInvoice]).'Invoice Date' + " / Betrag: " + last((select Rechnungen)['Invoice #' = myPrInvoice]).Rechnungsbetrag + " / Erhalten: " + last((select Rechnungen)['Invoice #' = myPrInvoice]).'Betrag erhalten'

    Nun habe ich versucgt, das selbe Resultat über die Abfrage des Rechnungsdatums zu realisieren, um die Eingabe der fortlaufenden Rechnungsnummer zu umgehen. Prinzipiell sollte das doch so funktionieren:

    let myActInvoice := 'Invoice Date;
    let myPrInvoice := (Der größte Datumswert, der kleiner ist als myActInvoice) max('Invoice Date' < myActInvoice);

    Aber das funktioniert nicht.

    Anyway, besten Dank euch beiden!

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

    Versuch's mal so:

     

    let myPrInvoice := last((select Rechnungen where 'Invoice Date' < myActInvoice) order by 'Invoice Date');

    • T_Bartzsch
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hi Ali,

     

    mit last, max, first usw. kannst Du nur innerhalb von Arrays navigieren (zB. [3, 8, 12, 16]).

    Mit (select Rechnungen)['Invoice #' = myPrInvoice] gibt ninox dir ein Array aus verschiedenen Einträgen zurück - auch wenn es nur einen Eintrag gibt auf den die Bedingung zutrifft.

    Daher funktioniert "last".

    Du kannst Dir aber auch hier wieder über select mit Bedingungen und sortierung helfen:

    last((select RECHNUNGEN) order by DEINDATUMSFELD) gibt dir die Nr des Datensatzes mit dem "größten" Datum.

     

    Zum Thema Fortlaufende Rechnungsnummer gobt es hier im Forum aber auch genügend Beiträge - wenn Du dir das händisch ersparen willst. Das ginge dann aber nur mit einem auslösenden Trigger als Button - wenn Du damit gleich einen neuen Datensatz in RECHNUNGEN anlegst, oder über "Trigger bei neuem Datensatz" in den Einstellungen der Tabelle

    • Ali
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Nochmals besten Dank, die Herren!

    Klappt vorzüglich! Jetzt muss ich das nur noch in ein Layout übertragen, damit beim Generieren der Rechnung ersichtlich ist, ob, wann, und in welcher Höhe die vorige Rechnung beglichen worden ist, damit der aktuelle Rechnungsbetrag gleich automatisch angepasst werden kann. Aber das krieg ich hin. Hoffe ich ...

    @T.: Die Posts mit den automatischen fortlaufenden Rechnungsnummern habe ich gesehen, ebenso die Hinweise in der Referenzdatenbank zum Webinar. Das kommt dann noch, mir gings erst einmal um die Kontrolle, ob der/die Kund/in auch brach die Rechnungen alle bezahlt hat ;-).

    Jetzt, danke an euch beide, kann ich das in die Rechnungsgenerierung einbauen.

    Beste Grüße

    ali