0

Unterschiedliche Preise für einen Artikel in Abhängigkeit von einem Kundenmerkmal

Hallo liebe Ninox-Community,

ich habe mich jetzt über die letzten Tage in das Tool eingefuchst und bin von dessen Möglichkeiten begeistert. Zu meinem "Glück" fehlt mir noch eine letzte Funktion, die ich allerdings nicht alleine hinbekomme. 

Folgende Ausgangslage. Ich habe einen Produktkatalog mit unterschiedlichen Preiskategorien (A und B).

In meiner Angebotsübersicht gibt es eine Untertabelle "Rechnungspositionen", in der ich in Abhängigkeit vom Käufermerkmal (Bestand- vs Neukunde) gern entweder die Preise der Kategorie A oder die der Kategorie B anzeigen lassen möchte. 

 Wie gehe ich am besten vor? Ich bin für jede Hilfe sehr dankbar.

10 Antworten

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

    Hallo Christian, woher kann Ninox denn wissen, ob der Käufer Preis A oder Preis B bekommt? Ist diese Information in den Stammdaten des Kunden/Käufers hinterlegt, bspw. als Auswahlfeld (KATEGORIE)? Falls ja, wäre noch die Frage, auf welche Weise die Daten aus dem Produkt-Datensatz in die Rechnungspositionen übertragen werden. Ich sehe da eine Formel, das sollte man aber nicht machen, weil sich Rechnungen dann im Nachhinein ändern können, wenn im Produkt der Preis geändert wird.

    Ich würde deshalb die die Rechnungsposition N:1 mit dem Produkt verknüpfen und im Verknüpfungsfeld (PRODUKTKATALOG) einen Trigger "Nach Änderung" hinterlegen:

    PREIS := if PRODUKTKATALOG then
        switch number('Käufer'.KATEGORIE) do
            case 1: PRODUKTKATALOG.'Preis A'
            case 2: PRODUKTKATALOG.'Preis B'
        end
    else
        null
    end

    Auf dieselbe Weise könnte man bspw. auch die Produktnummer, -beschreibung und ggf. weitere Daten aus dem Produktdatensatz auslesen und in Datenfelder der Rechnungsposition übernehmen.

    • christian_weissberger
    • vor 4 Tagen
    • Gemeldet - anzeigen

    Hallo planoxpro,

    vielen Dank Dir für die schnelle Antwort. Kurz zu den von Dir aufgeworfenen Fragen:
    Ja, Ninox soll anhand einer Information in den Stammdaten des Kunden (z.B. KATEGORIE: Bestandskunde) automatisch eine Preiskategorie zuordnen und bei den entsprechenden Produkten nutzen.

    Aktuell ziehe ich wie oben im zweiten Screenshot zu sehen in der Angebotsübersicht:
    1. Die "Käufer" aus einer anderen Tabelle "Kunden" (Angebotsübersicht -> Kunde; N:1)
    2. In der Untertabelle "Rechnungsposition" die Produktbeschreibung und (aktuell händisch) entweder die Preise der Kategorie A oder B aus einer dritten Tabelle "Produkte". 

    Thema Formel zum Übertrag der Produkt-Datensätze: Ja, da bin ich bei Dir. Wenn sich die Rechnungen im Nachgang verändern, weil man einem Preis im Produkt ändert, wäre das nicht im Sinne des Erfinders.

    Okay: Ich verknüpfe also die Rechnungspositionen N:1 mit den Produkten und lege für das Verknüpfungsfeld zum Produktkatalog den Trigger "Nach Änderung" an. Dein Skript verstehe ich auf anhieb leider noch nicht - ggf. kannst Du mir da nochmal ein wenig helfen und mir sagen, was es genau macht. Vielen Dank Dir schon jetzt.

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

       

      Mit "if PRODUKTKATALOG then" wird nur abgefragt, ob ein Produkt ausgewählt wurde. Denn wird das Feld geleert, muss ja auch der Preis auf Null gesetzt werden.

      Mit "switch" lässt sich ein Feld oder eine Variable auf verschiedene Werte abfragen, ohne dass man mit verschachtelten if-else-Konstruktionen arbeiten muss. Hier sind es nur zwei Werte, die abgefragt werden sollen, aber selbst das ist schon übersichtlicher und vor allem ließe es sich einfach erweitern, wenn mal weitere Kategorien dazu kämen. Mit den case-Zeilen wird innerhalb der switch-Abfrage den verschiedenen, zu erwartenden Werten jeweils eine eigene Aktion zugeordnet.

      number('Käufer'.KATEGORIE) ist der numerische Rückgabewert des Auswahlfeldes KATEGORIE in der Tabelle 'Käufer' (oder Kunde). Die Optionen von Auswahlfeldern werden beim Anlegen von Ninox automatisch durchnummeriert. In deinem Fall könnte also Bestandskunde = 1 und Neukunde = 2 sein (oder umgekehrt, das weiß ich jetzt nicht).

      Frei übersetzt sagt man Ninox mit dem Script: Wenn ein Produkt ausgewählt wurde, dann werte im verknüpften Kunden-Datensatz das Auswahlfeld KATEGORIE aus, wenn dessen Wert 1 ist, nimm den 'Preis A' des Produktes, bei 2 den 'Preis B' und schreibe ihn in das Datenfeld PREIS dieser Rechnungsposition.

      Wobei - wenn dabei gleich die Produktbeschreibung in die Rechnungsposition übernommen werden soll, könnte man es auch so schreiben:

      if PRODUKTKATALOG then
          PREIS := switch number('Käufer'.KATEGORIE) do
              case 1: PRODUKTKATALOG.'Preis A'
              case 2: PRODUKTKATALOG.'Preis B'
          end;
          BESCHREIBUNG := PRODUKTKATALOG.Produktbeschreibung
      else
          null
      end

      Wobei du die Namen der Tabellen und Datenfelder ggf. durch die tatsächlichen ersetzen solltest.
       

      Doku zu if ... else und switch ... case.

    • christian_weissberger
    • vor 4 Tagen
    • Gemeldet - anzeigen

    WOW - vielen herzlichen Dank für die schnelle Rückmeldung und die gute Erklärung. Ich probiere das Ganze aus und melde mich nochmal, wenn's geklappt hat. Merci!

    • christian_weissberger
    • vor 4 Tagen
    • Gemeldet - anzeigen

    Hallo panoxpro,

    ich krieg's leider nicht hin. Wäre es möglich, dass ich Dir ein Backup meine Projekts schicke und Du mir das Skript an den richtigen Stelle einpflegst? Ich glaube ich habe verstanden wie es funktionieren soll, allerdings bekomme ich es dennoch nicht zum Laufen. 

    Vielen Dank Dir schon jetzt für Deine Unterstützung.

    PS: Ist so was in einem der Demo-Projekte ggf. schon eingesetzt worden? Dann kann ich es mir auch dort mal ansehen.

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

       

      Das kannst du machen, aber vielleicht wäre es besser, wenn wir gemeinsam herauszufinden versuchen, warum es nicht klappt? Was genau kriegst du nicht hin? Gibt es Fehlerhinweise im Editor? Falls ja: Wenn man mit der Maus über die rot unterlegte Zeilennummer fährt. erscheint die genaue Fehlermeldung.

      Ich sehe auf den ersten Blick zwar keine Fehler, aber vielleicht habe ich ja auch was falsch gemacht. Ich war von folgenden Voraussetzungen ausgegangen:

      PRODUKTKATALOG ist der Name der Tabelle mit den Produkt-Stammdaten. In dieser befinden sich u. a. ein Textfeld namens Produktbeschreibung sowie zwei Zahlenfelder namens 'Preis A' und 'Preis B'.

      KATEGORIE ist ein Auswahlfeld mit den Optionen "Bestandskunde" (1) und "Neukunde" (2) in der Tabelle 'Rechnungspositionen', welche eine Untertabelle der RECHNUNGEN ist..

      In der Tabelle 'RECHNUNGEN' gibt es eine N:1-Verknüpfung zum 'Käufer' (bzw. Kunden, wenn die Tabelle so heißen sollte).

      Das Script läuft als "Trigger nach Änderung" im Verknüpfungsfeld PRODUKTKATALOG. Von dort wird auf die übergeordnete Rechnung zugegriffen und aus dieser wiederum auf den Käufer/Kunden.
       

    • christian_weissberger
    • vor 4 Tagen
    • Gemeldet - anzeigen

    Hey planoxpro,

    ich hab es tatsächlich hinbekommen. Vielen Dank für Deine Hilfe. Falls wer anders mal das Problem hat. Hier kurz in Bildern:

    Bis zu dem Status mit den Rechnungspositionen bin ich über die Video-Tutorials gekommen.

    Jetzt war die Herausforderung, dass ich über den Kundenstatus, die Höhe des Preises für die Produkte verändern wolle. Hierfür habe ich jetzt das von planoxpro vorgeschlagene Skript auf meine Tabellen- und Spaltennamen angepasst:

    'Preis pro Einheit' := if Produkt then
            switch number(Rechnungen.'Käufer'.Status) do
            case 1:
                Produkt.'Preis A aus Produkttabelle'
            case 2:
                Produkt.'Preis B aus Produkttabelle'
            end
        else
            null
        end

    Mir war anfangs nicht ganz klar, wo das Skript hingehört - das hier ist m.E. die richtige Stelle:
    Ich habe bei den Rechnungspositionen ein Produkt ausgewählt und es öffnet sich ein weiteres Bearbeitungsfeld mit den Infos zum Produkt:

    Nach einem Klick auf den Schraubenschlüssel kann man im sich öffnenden Menü das Skript im Feld "Trigger nach Änderung" platzieren:

    Verändert man jetzt in der Tabelle Kunde, den Status des Kunden z.B. auf "Interessent", wir bei den Artikeln der Rechnungsposition der Preis für diesen Kundenstatus verwendet. Perfekt!

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

      Ja, genau, "Trigger nach Änderung". Super!

    • christian_weissberger
    • vor 4 Tagen
    • Gemeldet - anzeigen

    Eine Frage noch an  : Der Sachverhalt wird in ähnlicher Weise auch in den Ninox Blog-Tutorials erklärt:

    https://forum.ninox.de/t/35yxw96/trigger-auf-feld-ebene

    Wenn man die Artikel liest, merkt man, dass die ursprünglich mal aus einem zusammenhängenden Tutorial stammen müssen. Gibt es das noch irgendwo? So wie es jetzt ist, muss man sich die Artikel mühevoll zusammensuchen uns es fehlt leider die Hälfte. Vielen Dank für den tollen Support! 👍

Content aside

  • vor 3 TagenZuletzt aktiv
  • 10Antworten
  • 49Ansichten
  • 2 Folge bereits