0

Brauche bitte Hilfe für einen Code im Berechnungsfeld

Hallo zusammen,

habe gefühlt etliche 'Möglichkeiten' ausprobiert, komme aber leider nicht weiter.

Ich habe mich an der Vorlage 'Rechnungen' orientiert.

Ich habe eine

Tabelle Kunden

Tabelle Produkte, die ich wiederum mit Tabelle Kunden verküpft habe (da Kunden auch Lieferanten der einzelnen Produkte sein können)

 

Die Untertabelle 'Rechnungspositionen' ist mit Tabelle Produkte verküpft.

 

So, nun möchte ich in einem Berechnungsfeld in Tabelle Kunden sehen können, wieviel € Lieferanten 'erzielt' haben.

Was ich bereits hinbekommen habe ist:

sum(Produkte.Rechnungspositionen.'Netto-Gesamt')

Ich hätte aber gerne noch ein Berechnungsfeld, welches mir nur die Summe der bereits bezahlten RG anzeigt.

Für 'normale' Kunden, die direkt in einer Rechnung ausgewählt werden, habe ich ein Berechnungsfeld mit folgendem Code:

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

Ich hatte u.a. versucht

if Rechnungen.Status = 3 then
sum(Produkte.Rechnungspositionen.'Netto-Gesamt')
end

aber dann bleibt das Feld leer,

Hat jemand eine Idee, wie das funktionieren könnte?

 

Vielen Dank schon mal!

 

Gruß Kruna

30 Antworten

null
    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Kruna,

    vielleicht so:

     

    sum(Produkte.Rechnungspositionen[Rechnungen.Status=3] .'Netto-Gesamt')

     

    Leo

    • Kruna
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Leo,

     

    vielen Dank, aber leider hat das auch nicht geklappt.

    Ich habe den Code mal in der DB Vorlage Rechnungen eingesetzt und bekomme folgenden Fehler angezeigt

     

    Bildschirmfoto 2021-10-12 um 12.31.22

     

    Gruß Kruna

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Die Verknüpfung zu Rechnungen heißt dort Rechnung, also:

    sum(Produkte.Rechnungspositionen[Rechnung.Status=3] .'Netto-Gesamt')

    • Kruna
    • vor 3 Jahren
    • Gemeldet - anzeigen

    HAllo Leo,

     

    genauso...suuuuuper, jetzt hat es funktioniert!!! Vielen Dank!!!!

     

    Gruß Kruna

    • Kruna
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Ich habe da noch eine Frage, denn irgendwie komme ich wieder nicht weiter. Ich halte mich nach wie vor an dem Beispiel der DB Rechnungen.

    Dort gibt es ein Auswahlfeld TYP. Nehmen wir an ich würde TYP 1 oder TYP 3 wählen, dann sollte nicht  'Netto Gesamt' ausgewählt werden, sondern 'Mwst.'

    Mein Ansatz war

    if Produkte.Rechnungspositionen.Rechnung.Typ = 1 or Produkte.Rechnungspositionen.Rechnung.Typ = 3 then
    sum(Produkte.Rechnungspositionen.'Mwst.')
    else
    sum(Produkte.Rechnungspositionen.'Netto-Gesamt')
    end

     

    ich habe das dann in meiner DB folgerndermassen umgesetzt:

     

    if 'Werbeträger_'.Rechnungspositionen.Rechnungen.Rechnungstitel = 5 or 'Werbeträger_'.Rechnungspositionen.Rechnungen.Rechnungstitel = 7 then
    sum('Werbeträger_'.Rechnungspositionen.'Summe Provi')
    else
    sum('Werbeträger_'.Rechnungspositionen.'Endsumme netto')
    end

     

    In der DB Rechnungen funktionert der Code, aber in meiner DB nicht. Hat jemand eine Idee, woran das liegen könnte oder was ich falsch gemacht habe könnte?

     

    Vielen Dank!

     

    Gruß Kruna

    • Kruna
    • vor 3 Jahren
    • Gemeldet - anzeigen

    NAchtrag:

     

    mit eckigen Klammern

     

    if 'Werbeträger_'.Rechnungspositionen[Rechnungen.Rechnungstitel = 5] or 'Werbeträger_'.Rechnungspositionen[Rechnungen.Rechnungstitel = 7] then
    sum('Werbeträger_'.Rechnungspositionen.'Summe Provi')
    else
    sum('Werbeträger_'.Rechnungspositionen.'Endsumme netto')
    end

     

    funktioniert es auch nicht

    • Tacho
    • vor 3 Jahren
    • Gemeldet - anzeigen

    evtl., weil es auch hier RECHNUNG anstelle RECHNUNGEN heißen müßte?

    • Kruna
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Tacho, danke für Deinen Ansatz, aber die Verknüpfung zu Rechnungen heißt bei mir Rechnungen, daher ist das richtig.

    Das kuriose ist wenn ich die eckige Klammer weglasse dann kommt der Betrag 'Endsumme netto' und bleibt, egal welchen Rechnungstitel ich wähle und wenn ich die eckige Klammer anwende, dann erscheint der Betrag 'Summe provi', ebenso egal welchen Rechnungstitel ich wähle

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Kruna,

    das, was du schreibst, macht eigentlich keinen Sinn:

    ein werberträger hat mehrere Positionen und diese können u.U. zu mehreren Rechnungen gehöhren. Jetzt fragst du (übersetzt) WENN von dem Werbeträger die Rechnungspositionen welche zu den Rechnungen mit Rechnungstitel 5 gehöhren... dann 'Summe Provi'. Da, wo die Drei Punkte sind, soll jetzt nocht etwas stehen.
    Es ist gar nicht klar was genau geprüft werden soll. Angenommen es gibt zu einem Werbeträger sowohl die Rechnungen mit Titel 5 als auch mit Titel 4. Was soll Ninox jetzt nehmen?

    • Kruna
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Vielen DAnk Leo,

    ok entschuldige, ich versuche es noch einmal etwas verständlicher.

    Ich habe in Kunden ein Berechnungsfeld und da soll der Code eigentlich rein. Wie oben beschrieben habe ich Tabelle Kunden auch mit Produkte - in meinem Fall - Werbeträger verknüpft (da ein Kunden auch Lieferant, quasi Pächter eines Werbeträgers ist)

    In Tabelle Rechnungen habe ich ein Auswahlfeld Rechnungstitel u.a. 1. Rechnung, 2. Stornorechnung usw. 5. Provisionsgutschrift 7. Provisionsgutschrift xxx (wie in der Vorlage Rechnungen das Auswahlfeld Typ)

    Wenn  nun in der Rechnung 5. Provisionsgutschrift oder 7. Provisionsgutschrift xxx ausgewählt wird, dann soll in Rechnungspositionen das Berechnungsfeld  'Summe von Provi'  genommen werden. Bei allen anderen Rechnungstiteln soll in Rechnungspositionen das Berechnungsfeld 'Endsumme netto' genommen werden.

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    sum('Werbeträger_'.Rechnungspositionen.if Rechnungen.Rechnungstitel=5 or  Rechnungen.Rechnungstitel=7 then 'Summe Provi' else 'Endsumme netto')

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    end vergessen

    sum('Werbeträger_'.Rechnungspositionen.if Rechnungen.Rechnungstitel=5 or Rechnungen.Rechnungstitel=7 then 'Summe Provi' else 'Endsumme netto' end)

    • Kruna
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Wooww!!! Tausend DAnk LEo,

    wie immer genau die Lösung nach der ich gesucht hatte!

     

    Gruß

    Kruna

    • Kruna
    • vor 3 Jahren
    • Gemeldet - anzeigen

    HAllo nochmals,

     

    entschuldigung, ich habe noch ein Berechnungsfeld und versuche die ganze Zeit den richtigen Code zu finden.

     

    if 'Werbeträger_'.Rechnungspositionen.Rechnungen.Rechnungstitel = 5 or Rechnungen.Rechnungstitel = 7 then
    'Umsatz Pacht' / 100 * first('Werbeträger_'.Rechnungspositionen.'Provi %') - 'RG Pacht'
    else
    'Umsatz Pacht' - 'RG Pacht'
    end

     

    Then und else alleine stehend, ist richtig. Irgendwo in der if - Konstruktion ist etwas falsch. Es wird zwar kein Fehler angezeigt, aber nur die 'else'-Berechnung wird berücksichtigt.

     

    Vielen Dank und Gruß Kruna

    • RMS Immobilière
    • Arsene_Nickels
    • vor 3 Jahren
    • Gemeldet - anzeigen

    zumindest solltest du bei der 2. Bedingung den ganzen Pfad wiederholen oder, eleganter, ihn vorher in eine Variable schreiben, zB

    let xx:='Werbeträger_'.Rechnungspositionen.Rechnungen.Rechnungstitel ;

    if xx= 5 or 7 then .......

    • Kruna
    • vor 3 Jahren
    • Gemeldet - anzeigen

    HAllo Arsene,

     

    Ich habe leider immer noch sehr wenig Ahnung und habe versucht aus Leo's Code irgednetwas herzuleiten, aber auch an dieser Stelle vielen DAnk für den Hinweis.

    Nun habe ich folgendes eingegeben:

     

    let xx := 'Werbeträger_'.Rechnungspositionen.Rechnungen.Rechnungstitel;
    if xx = 5 or 7 then
    'Umsatz Pacht' / 100 * first('Werbeträger_'.Rechnungspositionen.'Provi %') - 'RG Pacht'
    else
    'Umsatz Pacht' - 'RG Pacht'
    end

     

    Then-Anweisung funktioniert, aber else nicht, oder was habe ich wieder falsch gemacht?

     

    Gruß Kruna

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

    Versuch mal

     

    if xx = 5 or xx = 7 then

    • Kruna
    • vor 3 Jahren
    • Gemeldet - anzeigen

    gerade ausprobiert mit dem Ergebnis, dass nun die else-Anweisung funktioniert, aber then nicht.

     

    Gruß

    Kruna

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

    Die Syntax der Abfrage ist so auf jeden Fall richtig. Erstelle mal ein Funktionsfeld und schreibe dort hinein:

     

    'Werbeträger_'.Rechnungspositionen.Rechnungen.Rechnungstitel

     

    Dann sieht man, was als Wert zurückgegeben wird.

    • Kruna
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Ich habe es gerade mal versucht und es wird im Funktionsfeld kein Wert zurückgegeben, das Feld bleibt leer.

     

    Gruß

    Kruna

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

    Stimmt der Pfad? Ist 'Rechnungstitel' ein (einfaches) Auswahlfeld? Ist dort tatsächlich ein Wert ausgewählt?

    • Kruna
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Der Pfad sollte stimmen (funktioniert bei anderen Berechungsfeldern ebenso), Rechnungstitel ist ein einfaches Auswahlfeld und ein Wert(Provisionsgutschrift) ist auch ausgewählt.

     

    Gruß Kruna

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

    Wie Leo schon sagte: Da die Werbeträger in mehreren Rechnungspositionen vorkommen, weiß Ninox nicht, welche es nehmen soll. Du müsstest also auch hier mit first() arbeiten, so, wie du es auch in der Formel gemacht hast. Zum Beispiel so:

     

    let xx := 'Werbeträger_'.first(Rechnungspositionen).Rechnungen.Rechnungstitel

     

    Allerdings wäre das jetzt eine rein technische Lösung, die den Wert anhand der ersten Rechnungsposition zurückgibt. Vermutlich ist aber der Wert einer ganz bestimmten Rechnung gefragt. Mir ist aber nicht klar, welcher und wo genau das Ergebnis erscheinen soll.

    • Kruna
    • vor 3 Jahren
    • Gemeldet - anzeigen

    first() hat auch nichts gebracht.

    Das Ergebnis bzw das Berechnungsfeld ist in der Tabelle Kunden, wie zB hier:

    Bildschirmfoto 2021-10-18 um 14.11.15

    Wie ich Anfangs geschrieben hatte, ist TAbelle Kunden auch mit Tabelle Werbeträger verknüpft. Das wäre equivalent zur DB Vorlage Rechnungen Kunden>Produkte.

    Bildschirmfoto 2021-10-18 um 14.09.40

    Des Weiteren hattest Du mir mal eine DB zugeschickt

    https://ninox.com/en/forum/technische-hilfe-5ab8fe445fe2b42b7dd39ee8/aus-auftrag-eine-rechung-erstellen-5e946ea45e353d53a6fa5c82

    Dort waren diese Berechnungsfelder, die ich gerade versuche zu implemetieren udn eigentlich funktionieren sie auch, ausser wenn Kunde mit Produkte verknüpft und Produkte zB mit TAbelle Rechungspositionen.

     

    Ich hoffe, dass ich mich einigermassen verständlcih erklären kann, bitte um Nachsicht.

     

    Gruß

    kruna

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

    Kruna, ich verstehe nicht, in WELCHER Rechnung du den Rechnungstitel abfragen willst. Ein Produkt kommt normalerweise in mehreren Positionen verschiedener Rechnungen vor. Kunden haben in der Regel mehrere Rechnungen mit verschiedenen Positionen.

     

    Der Pfad "Produkte.Rechnungspositionen.Rechnungen.Rechnungstitel" würde aber eine eindeutige Verbindung zwischen den einzelnen Tabellen voraussetzen. Sprich: Jedes Produkt dürfte nur in einer einzigen Rechnungsposition vorkommen und diese wiederum nur in einer einzigen Rechnung.

     

    Ich sehe also keine direkte Verbindungslinie zwischen einem Produkt und einer bestimmten Rechnung.

     

    Oder ist jedes Produkt einmalig, kommt also immer nur ein einziges Mal als Rechnungsposition in einer einzigen Rechnung vor und dann nie wieder? Dann könnte man es mal so versuchen:

     

    let xx := first('Werbeträger_').first(Rechnungspositionen).Rechnungen.Rechnungstitel

     

    Aber Sinn ergibt das alles für mich nicht.