0

2 Auswahlfeldern werte zuweisen....

Grüßt euch,

bin am verzweifeln mit Bedingungen für die Zuweisung von 2 Auswahlfeldern. 

Sie sollen den Status von Rechnungen abbilden. (Beim start auf Tabellenebene über select / beim bearbeiten der Rechnung (Geldeingang, Mahnung usw. ) im Rekord.

Das Problem ist , das dies immer nur funktioniert wenn es für Ninox nur EINE richtige Lösung/ Variante gibt. Hier bin ich echt am verzweifeln. Geht das nicht irgendwie anders??

hier mal der Ansatz für die Bearbeitung imRekord. (geht noch nicht, weil fehler in den Bedingungen sind)

if Rechnungstyp = 1 and 'in Rechnung wandeln' = false then
    Rechnungsstatus := 9
else
    if Rechnungstyp = 1 and 'in Rechnung wandeln' = true then
        Rechnungsstatus := 11
    else
        if '1.Mahnung erzeugt' = true and 'Zahlungserrinnerung erzeugt' = true then
            Rechnungsstatus := 10
        else
            if 'Zahlungserrinnerung erzeugt' = true then
                Rechnungsstatus := 13
            else
                if '2.Mahnung erzeugt' = true and 'Zahlungserrinnerung erzeugt' = true and '1.Mahnung erzeugt' = true then
                    Rechnungsstatus := 12
                else
                    if 'Offener Rechnungsbetrag' < 1 then
                        Rechnungsstatus := 5
                    else
                        if 'Offener Rechnungsbetrag' > 1 and 'Offener Rechnungsbetrag' < 'Brutto-Gesamt:' then
                            Rechnungsstatus := 8
                        else
                            if Rechnungstyp > 1 and 'erwarteter Zahlungseingang' > today() and 'Offener Rechnungsbetrag' = 'Brutto-Gesamt:' then
                                Rechnungsstatus := 2
                            else
                                if 'Versandart wählen' = 7 then
                                    Rechnungsstatus := 6
                                else
                                    if Rechnungstyp = 4 or 'in Gutschrift wandeln' = true then
                                        Rechnungsstatus := 7
                                    else
                                        if Rechnungstyp = 2 and 'erwarteter Zahlungseingang' < today() and 'Offener Rechnungsbetrag' = 'Brutto-Gesamt:' and 'in Gutschrift wandeln' = false and '1.Mahnung erzeugt' = false and '2.Mahnung erzeugt' = false and 'Zahlungserrinnerung erzeugt' = false then
                                            Rechnungsstatus := 4
                                        end
                                    end
                                end
                            end
                        end
                    end
                end
            end
        end
    end
end;
if Rechnungsstatus = 13 and 'Neues Zahlungsziel errinnerung' < today() then
    Mahnstatus := 3
else
    if Rechnungsstatus = 10 and 'Neues Zahlungsziel 1. Mahnung' < today() then
        Mahnstatus := 4
    else
        if Rechnungsstatus = 10 and 'Neues Zahlungsziel 1. Mahnung' > today() then
            Mahnstatus := null
        else
            if Rechnungsstatus = 12 and 'Neues Zahlungsziel 2. Mahnung' < today() then
                Mahnstatus := 5
            else
                if Rechnungsstatus = 12 and 'Neues Zahlungsziel 2. Mahnung' > today() then
                    Mahnstatus := null
                else
                    if 'Mahnstop Zahlungserrinnerung' = true and Rechnungsstatus = 13 then
                        Mahnstatus := 6
                    else
                        if 'Mahnstop 1. Mahnung' = true and Rechnungsstatus = 10 then
                            Mahnstatus := 6
                        else
                            if 'Mahnstop 2. Mahnung' = true and Rechnungsstatus = 12 then
                                Mahnstatus := 6
                            else
                                if 'Mahnstop Zahlungserrinnerung' = false and 'Mahnstop 1. Mahnung' = false and 'Mahnstop 2. Mahnung' = false and Rechnungsstatus = 4 then
                                    Mahnstatus := null
                                end
                            end
                        end
                    end
                end
            end
        end
    end
end

Das hier ist der bestehende (funktionierender teil, aber nur für ein Auswahlfeld beim start auf Tabellenebene)

do as server
    let myR := (select Rechnungsstellung);
    myR[Rechnungstyp = 1 and 'in Rechnung wandeln' = false].(Rechnungsstatus := 9);
    myR[Rechnungstyp = 1 and 'in Rechnung wandeln' = true].(Rechnungsstatus := 11);
    myR['1.Mahnung erzeugt' = true].(Rechnungsstatus := 10);
    myR['2.Mahnung erzeugt' = true].(Rechnungsstatus := 12);
    myR['Offener Rechnungsbetrag' < 1].(Rechnungsstatus := 5);
    myR['Offener Rechnungsbetrag' > 1 and 'Offener Rechnungsbetrag' < 'Brutto-Gesamt:'].(Rechnungsstatus := 8);
    myR[Rechnungstyp > 1 and 'erwarteter Zahlungseingang' > today() and 'Offener Rechnungsbetrag' = 'Brutto-Gesamt:'].(Rechnungsstatus := 2);
    myR['Versandart wählen' = 7].(Rechnungsstatus := 6);
    myR[Rechnungstyp = 4 or 'in Gutschrift wandeln' = true].(Rechnungsstatus := 7);
    myR[Rechnungstyp = 2 and 'erwarteter Zahlungseingang' < today() and 'Offener Rechnungsbetrag' = 'Brutto-Gesamt:' and 'in Gutschrift wandeln' = false and '1.Mahnung erzeugt' = false and '2.Mahnung erzeugt' = false].(Rechnungsstatus := 4)
end

10 Antworten

null
    • Michi.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Ich nochmal,

    Brauch in dem Fall mal keine fertige Lösung, nur einen Ansatz wie es vielleicht besser geht. (Bin glaube ich gefangen in meinem ansatz, welcher für die bestehende DB funktioniert,  jedoch für die neue erweiterte nicht brauchbar ist. Rechnugsstellung wird in eine große bestehende DB eingebaut) Wichtig ist nur das es automatisch geht für alle Rechnungen beim Start der DB. Sonst können die wirklich vielen Rechnungen nicht auf stand gehalten werden. 

    Michi

    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hi Michi. Mal drei Vorschläge. 1. Zuerst würde ich auf switch-case umstellen, damit es etwas übersichtlicher wird und  2. würde ich die Bedingungen zusammenfassen, die das gleiche Ergebnis erreichen, z.B.

    case (Bedingung A and Bedingung B) or (Bedingung A and Bedingung C) or (Bedingung A and Bedingung D) :  Mahnstatus := 6

    3. Würde ich die Reihenfolge so wählen, dass die komplexesten Bedingungen zuerst stehen.

    Mirko

      • Michi.1
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Mirko grüß dich und danke dir erstmal.

      probiere ich gerne.  Andere ansetze als über die ganzen Bedingungen zu rennen gibt es wohl nicht?

      Da nehme ich mir mal nen Zettel und nen Stift um für jedes Szenario die Bedingungen raus zu schreiben um am ende zu schauen, was noch rein muss um die Einzigartigkeit hin zu bekommen. (das ist großes, blödes kopfkino 😫)

    • Michi.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hab jetzt nen anderen Ansatz.  Komm aber mit dem Skript nicht klar.  "Zahl für Auswahl" wird mit number() gefüllt sind (fx felder). 

    case 17 or 1017 : (Ergebins: Wahr/Falsch, bei wahr führe nachfolgendes Script aus)

    setze 'Rechnungsstatus/ Test' auf 3

    macht Ninox aber nicht... sondern geht auf default  (klammer oder anführungszeichen für werte ändern daran nichts)

    let zahl := 'Zahl für Auswahl';
    'Rechnungsstatus/ Test' := switch zahl do
        case 1 or 1001:
            1
        case 2:
            2
        case 17 or 1017:
            3
        case 602 or 1602:
            4
        case 502 or 1502:
            5
        case 1002:
            6
        case 1013 or 1613:
            7
        case 1025 or 1625:
            8
        case 1038 or 1638:
            9
        default:
            10
        end
    

    würde das wenn es geht auch gleich für die ganze Tabelle machen wollen, ist denk ich mal von der performens besser, da nur ein select vorhanden ist.

    let myR := (select Rechnungsstellung);
        let zahl := myR.'Zahl für Auswahl';
    myR.'Rechnungsstatus/ Test' := switch zahl do
        case 1 or 1001:
            1
        case 2:
            2
        case 17 or 1017:
            3
        case 602 or 1602:
            4
        case 502 or 1502:
            5
        case 1002:
            6
        case 1013 or 1613:
            7
        case 1025 or 1625:
            8
        case 1038 or 1638:
            9
        default:
            10
        end
    
    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Ich meinte eher so. Die Klammern sind nur zur Verdeutlichung, wahrscheinlich tilgt der Scripteditor sie wieder. So kannst Du Deine if-else Konstruktion nur umtragen. Mirko

    let michi := "admin";
    switch michi = "admin" do
    case ('Mahnstop Zahlungserrinnerung' = true and Rechnungsstatus = 13) or ('Mahnstop 1. Mahnung' = true and Rechnungsstatus = 10) or ('Mahnstop 2. Mahnung' = true and Rechnungsstatus = 12):
        Mahnstatus := 6
    case ...
    end
    
      • Michi.1
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Mirko hab die ganzen Bedingungen jetzt in eindeutige Zahlenwerte umgewandelt. So muss ich nicht mit den Konstrukten arbeiten. Das passt ja. Nur wenn ich bei case mit "or" also 2 werten arbeite will ninox es nicht wissen. bei nur einem wert klappt es. 

      • Michi.1
      • vor 2 Jahren
      • Gemeldet - anzeigen

      laut Leo sollte es doch gehen... aus dem Forum:

       

      Hallo Maurice,

      ---

      let TN := number('Anzahl TN Päd');
      let Basis := 102 * 2.5 / 19;
      switch TN >= 0 do
      case TN > 0 and TN < 10:
      round(Basis * 0.5) / 2
      case TN > 9 and TN < 12:
      round(Basis * 0.7) / 2
      case TN > 11 and TN < 15:
      round(Basis * 0.8) / 2
      case TN > 14 and TN < 18:
      round(Basis * 0.9) / 2
      case TN = 18:
      round(Basis) / 2
      case TN > 18:
      round(Basis * 1.1) / 2
      default:
      0
      end

      ---

      aber so umgebaut geht es auch nicht... weis nicht wo der Fehler ist.

      let zahl := number('Zahl für Auswahl');
      'Rechnungsstatus/ Test' := switch zahl do
          case zahl = 1 or zahl = 1001:
              1
          case 2:
              2
          case zahl = "17" or zahl = "1017":
              3
          case zahl = 602 or zahl = 1602:
              4
          case zahl = 502 or zahl = 1502:
              5
          case 1002:
              6
          case zahl = 1013 or zahl = 1613:
              7
          case zahl = 1025 or zahl = 1625:
              8
          case zahl = 1038 or zahl = 1638:
              9
          default:
              10
          end

    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Füge mal die Bedingung an die Zahl, sonst geht das Konstrukt nicht.

    'Rechnungsstatus/ Test' := switch zahl > 0 do
    
      • Michi.1
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Mirko hätte ich nie gefunden... dann klappts auch. Danke👍

    • Michi.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    für die Tabelle 

    do as server
        for i in select Rechnungsstellung where Nr = Nr do
            let zahl := number(i.'Zahl für Auswahl');
            i.('Rechnungsstatus/ Test' := switch zahl > 0 do
                case zahl = 1 or zahl = 1001:
                    1
                case zahl = 2:
                    2
                case zahl = 17 or zahl = 1017:
                    3
                case zahl = 602 or zahl = 1602:
                    4
                case zahl = 502 or zahl = 1502 or zahl = 1538 or zahl = 1525 or zahl = 1513:
                    5
                case zahl = 1002:
                    6
                case zahl = 1013 or zahl = 1613:
                    7
                case zahl = 1025 or zahl = 1625:
                    8
                case zahl = 1038 or zahl = 1638:
                    9
                default:
                    10
                end)
        end
    end