0

Rechnen mit Verpackungseinheiten

Hallo Forum,

es geht um Getränke und ich möchte, dass die Mengen in korrekter Schreibweise angezeigt werden.

In den Stammdaten der Getränke sind verschiedene Felder für die Einheiten hinterlegt:

'Menge' - Anzahl einzelner Einheiten
'VE' - Menge einer Verpackungseinheit
'1 Stück' - Bezeichnung, z.B. "Flasche"
'Mehrzahl Stück' - Bezeichnung z.B. "Flaschen"
'1 VE' - Bezeichnung der VE, z.B. "Kiste"
'Mehrzahl VE' - Bezeichnung bei Mehrzahl, z.B. "Kisten"

Okay, wenn die Menge z.B. 1 ist, soll das Ergebnis sein "1 Flasche"

bei Menge 3 logischerweise "3 Flaschen"

Menge gleich VE (z.B. 24) wäre dann "1 Kiste"

Menge größer als VE(24) aber kleiner als 2 VE (z.B. 28)  ist dann "1 Kiste, 4 Flaschen"
VE 48 müsste dann sein "2 Kisten"
Dazu gibt es je nach Menge noch abwandlungen mit der Ein- und Mehrzahl, wie z.B. "2 Kisten, 1 Flasche"

Auch wäre es super, wenn man diese Berechnung bei 'Globale Funktionsdefinitionen' anlegen könnte. Ich brauche die Korrekte Berechnung der Getränke-Einheiten nämlich an verschiedenen Stellen.

Ich habe schon rumprobiert, aber komme wie so oft nicht weiter. *seufz*

Weiß jemand Rat?

Gruß

Oliver M.

8 Antworten

null
    • Frank_Schafer
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Oliver,

    ich hoffe, ich habe so aus dem Bauch heraus (ohne Ninox) keine Syntax-Fehler eingebaut ;) :

    function mengenText(Menge : number, Getr : 'Getränk') do
      let anzahlVE := floor(Menge / Getr.'VE');
      let anzahlST := Menge - (anzahlVE * Getr.'VE');
      var result := "";
      if anzahlVE > 1 then
        result := text(anzahlVE) + " " + Getr.'Mehrzahl VE'
      end;
      if anzahlVE = 1 then
        result := text(anzahlVE) + " " + Getr.'1 VE'
      end;
      if anzahlST > 1 then
        if result != "" then
          result := result + ", ";
        end;
        result := result + text(anzahlST) + " " + Getr.'Mehrzahl Stück'
      end;
      if anzahlST = 1 then
        if result != "" then
          result := result + ", ";
        end;
        result := result + text(anzahlST) + " " + Getr.'1 Stück'
      end;
      result
    end;

    VG Frank

    • CitizenDeveloper
    • Oliver_meerkamp
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Frank,

     

    vielen Dank, dass sieht schon sehr gut aus, aber da muss noch ein Fehler sein oder ich mache was falsch.
    Meine Tabelle heißt 'Getränke' Es gibt in der Tabelle ein berechnetes Feld 'Bestand', das Ergebnis dort ist eine Zahl.

     

    Ich hab zum testen in der Tabelle 'Getränke' ein neues Berechnungsfeld erstellt und die Funktion dort eingefügt.
    'Menge' habe ich mit 'Bestand' ausgetauscht. Ninox zeigt keine Fehler an, aber das Berechnungsfeld bleibt leer. ??

     

    Ich kann fast alles ganz gut nachvollziehen, sieht alles schlüssig aus, nur oben den Ausdruck "number,Getr" verstehe ich nicht.

    • Frank_Schafer
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Oliver,

    dies ist ja eine Funktion die du zentral unter Optionen --> Globale Funktionsdefinitionen ablegen kannst. Der Ausdruck in Klammern nach dem Funktionsnamen (Bestand : number, Getr : 'Getränke') gibt an, dass diese Funktion mit 2 Optionen aufzurufen ist - zuerst mit der Menge und als 2. mit dem passenden Datensatz der Tabelle Getränke. Was natürlich in diesem Fall noch dazu kommen muss ist der Funktionsaufruf. Aus der Tabelle Getränke dann z. B. über ein Funktionsfeld:

    let myGetraenk := this();
    mengeText(myGetraenk.Bestand, myGetraenk);

    Aus anderen Tabellen musst du den Funktionsaufruf passend abändern. Wenn du die Funktion nicht zentral ablegen möchtest dann müsstest du die Funktion in dem Funktionsfeld oberhalb dieser 2 Zeilen einfügen.

    Du hättest jetzt Menge nicht durch Bestand ersetzen müssen, da diese Variable ja nur innerhalb der Funktion gilt und nicht direkt in Verbindung mit der Tabelle/dem Tabellenfeld steht - aber deine Umsetzung dieser Funktion ist genauso gut.

    VG Frank

    • CitizenDeveloper
    • Oliver_meerkamp
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Frank,

     

    danke für die Aufklärung!

    Jetzt habe ich den Dreh raus und es klappt Super. Genau so habe ich mir das vorgestellt! :-)
    Vielen, vielen Dank!!!

    Gruß

    Oliver M.

    • CitizenDeveloper
    • Oliver_meerkamp
    • vor 5 Jahren
    • Gemeldet - anzeigen

    mhm..versuche es von einer anderen Tabelle (Unterbabelle) heraus, aber da bekomme ich im Berechnungsfeld einen "internal" Error *seufz*

    Du sagst:

    ""Aus anderen Tabellen musst du den Funktionsaufruf passend abändern.""

    Was muss ich verändern. z.B. wenn ich es in der Tabelle 'Getränke Einkauf' nutzen möchte?

    • Frank_Schafer
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Kommt drauf an, wie die Tabellenstruktur ist ... ich gehe mal davon aus, dass du in 'Getränke Einkauf' das Feld 'Getränk' hast mit dem du das Getränk aus der Tabelle 'Getränke' verknüpft hast. Weiterhin ein Feld 'Bestellmenge' mit der Menge:

    let myEinkauf := this();

    mengeText(myEinkauf.Bestellmenge, myEinkauf.'Getränk')

    Stimmen meine Annahmen nicht, musst du entweder die Feldnamen ändern oder mir mal mehr über die Struktur verraten. ;)

    VG Frank

    • CitizenDeveloper
    • Oliver_meerkamp
    • vor 5 Jahren
    • Gemeldet - anzeigen

    ähem...uff.....jetzt bin ich raus, komme nicht mehr mit.
    Soll ich mich dazu am Mittwoch mal im Webinar melden? - dann kann ich das sicher besser zeigen....

    • Birger_H
    • vor 5 Jahren
    • Gemeldet - anzeigen

    ...gute Idee.

    Birger

Content aside

  • vor 5 JahrenZuletzt aktiv
  • 8Antworten
  • 1974Ansichten