0

Feldnamen in Variable schreiben?

Hallo,

 

ist es eigentlich irgendwie möglich, eine Variable mit einem Feldnamen zu bestücken und diesen dann als solchen weiterzuverwenden?

 

Hintergrund: Ich möchte in einer Tabelle 'Kunde' ein Auswahlfeld 'Preisgruppe' mit Optionen "Preisgruppe 1", "Preisgruppe 2", ..., "Preisgruppe 5" anlegen. In einer Tabelle 'Artikel' sollen die Preise je Preisgruppe in entsprechenden Feldern 'Preisgruppe 1', 'Preisgruppe 2', ..., 'Preisgruppe 5' direkt eingetragen werden. Wenn ich nun weiteren Verlauf z.B. ein Verkaufsdokument erstelle, möchte ich mir in der jeweiligen Position genau den Preis aus der Tabelle 'Artikel' holen, der zur beim Kunden ausgewählten Preisgruppe passt.

 

Ich dachte an etwas wie:

 

var myPreis := text(Kunde.Preisgruppe);
Preis := Artikel.myPreis

 

in der Form hab ich's natürlich bereits erfolglos versucht - gibt's einen anderen Kniff, der mich zum Ziel führt?

 

lg, Torsten

9 Antworten

null
    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Anmerkung:

     

    Dass ich das wie folgt auch lösen kann, ist mir klar:

     

    Preis := switch text(Kunde.Preisgruppe) do
    case "Preisgruppe 1":
    Artikel.'Preisgruppe 1'
    case "Preisgruppe 2":
    Artikel.'Preisgruppe 2'
    .
    .
    .
    case "Preisgruppe 5":
    Artikel.'Preisgruppe 5'
    end

     

    ... aber wenn ich im Skript den Feldnamen öfters benutzen will (z.B. weil evtl. Staffelpreise greifen könnten), dann wird's ein langer Code.

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

    Hallo Torsten, variable Feldnamen funktionieren leider nicht. Aber das hast du ja selbst schon gemerkt. Was die mehrfache Nutzung angeht, so würde sich vielleicht eine Funktion anbieten, evtl. sogar eine globale.

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Copytexter,

     

    danke, ich hab's befürchtet.

     

    Könnte ich denn mit Artikel.PG(Kunde) ebenso wie mit Artikel.Staffelpreis.PG(Kunde) auf den Feldnamen zurückgreifen, wenn mir die Funktion PG(Kunde) diesen als text(Preisgruppe) liefert?

     

    Ich sehe schon, ich muss mich doch mal mit dem bisher von mir vernachlässigten Thema Funktionen befassen. ;)

    lg, Torsten

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

    Also, es mag durchaus schlauere Lösungen geben, aber ich würd's wahrscheinlich so machen (Nutzung der numerischen IDs der Einträge im Auswahlfeld 'Preisgruppe'):

    function GetPrice(PG : number,ArtRecord : number) do
        let myPreis := switch PG > 0 do
            case 1: first((select Artikel where number(Nr) = ArtRecord).'PG 1')
            case 2: first((select Artikel where number(Nr) = ArtRecord).'PG 2')
            case 3: first((select Artikel where number(Nr) = ArtRecord).'PG 3')
            case 4: first((select Artikel where number(Nr) = ArtRecord).'PG 4')
            case 5: first((select Artikel where number(Nr) = ArtRecord).'PG 5')
            end;

        myPreis

    end

    Aufruf der Funktion dann immer mit Preisgruppe und Artikelnummer, z. B. aus einer Auftragsposition heraus:

    let myPG := number(Auftrag.Kunden.Preisgruppe);
    let myArtikel := number(Artikel.Nr);

    Preis := GetPrice(myPG, myArtikel)

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Copytexter,

     

    danke für den Steigbügel - ich werd's später mal versuchen umzusetzen und vom Ergebnis berichten.

     

    lg, Torsten

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hmm, funktioniert nicht ganz. Hab das Skript als Änderungstrigger bei der Verknüpfung zum Artikel, er zieht _immer_ den Preis aus 'Preisgruppe 1', egal, welche Preisgruppe der Kunde hat...

     

    if Artikel then
    function GetPrice(PG : number,ArtRecord : number) do
    let myPreis := switch PG > 0 do
    case 1:
    first((select Artikel where number(Nr) = ArtRecord).'Preisgruppe 1')
    case 2:
    first((select Artikel where number(Nr) = ArtRecord).'Preisgruppe 2')
    case 3:
    first((select Artikel where number(Nr) = ArtRecord).'Preisgruppe 3')
    case 4:
    first((select Artikel where number(Nr) = ArtRecord).'Preisgruppe 4')
    case 5:
    first((select Artikel where number(Nr) = ArtRecord).'Preisgruppe 5')
    end;
    myPreis
    end;
    let myPG := number(Auftrag.Kunde.Preisgruppe);
    let myArtikel := number(Artikel.Nr);
    Preis := GetPrice(myPG, myArtikel)
    end

     

    Was überseh ich nur?

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Anmerkung: Meine vorgenannte direkte Methode klappt übrigens:

     

    if Artikel then
    Preis := switch text(Auftrag.Kunde.Preisgruppe) do
    case "Preisgruppe 1":
    Artikel.'Preisgruppe 1'
    case "Preisgruppe 2":
    Artikel.'Preisgruppe 2'
    case "Preisgruppe 3":
    Artikel.'Preisgruppe 3'
    case "Preisgruppe 4":
    Artikel.'Preisgruppe 4'
    case "Preisgruppe 5":
    Artikel.'Preisgruppe 5'
    end
    end

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

    Klar, so funktioniert es natürlich. Ich hatte deine Ausgangsfrage so verstanden, dass du den Code mehrfach nutzen wolltest. Deshalb die Idee mit der Funktion. Aber eine solche macht natürlich nur Sinn, wenn man Code auslagern und/oder an verschiedenen Stellen nutzen will.

    Interessehalber habe ich obige Funktion GetPrice() testweise mal als globale Funktion definiert (DB-Optionen) und wie gehabt aus einer Auftragsposition aufgerufen:

    let myPG := number(Auftrag.Kunden.Preisgruppe);
    let myArtikel := number(Artikel.Nr);
    Preis := GetPrice(myPG, myArtikel)

    Die Funktion selbst hatte ich nur an einer Stelle geändert. Wenn man "switch WERT > X" schreibt, dann muss man offenbar auch "case WERT = Y" schreiben. Deshalb habe ich das "< 0" beim 'switch' weggelassen. Ansonsten auch derselbe Code wie oben:

     

    function GetPrice(PG : number,ArtRecord : number) do
        let myPreis := switch do
            case 1: first((select Artikel where number(Nr) = ArtRecord).'PG 1')
            case 2: first((select Artikel where number(Nr) = ArtRecord).'PG 2')
            case 3: first((select Artikel where number(Nr) = ArtRecord).'PG 3')
            case 4: first((select Artikel where number(Nr) = ArtRecord).'PG 4')
            case 5: first((select Artikel where number(Nr) = ArtRecord).'PG 5')
            end;
        myPreis
    end

    Ergebnis: Mit einer Schaltfläche funktioniert es, als Trigger "Nach Änderung" nicht. Derselbe Code. Manchmal verstehe ich Ninox auch nicht. 🤕

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Copytexter,

     

    ich leg noch was ominöses drauf, ich hab meinen Funktions-Code auch um das "> 0" reduziert und siehe da, es klappt als Trigger bei Änderung bei der Verknüpfung 'Artikel' genau wie gewünscht...

     

    if Artikel then
    function GetPrice(PG : number,ArtRecord : number) do
       let myPreis := switch PG do
    case 1:
    first((select Artikel where number(Nr) = ArtRecord).'Preisgruppe 1')
    case 2:
    first((select Artikel where number(Nr) = ArtRecord).'Preisgruppe 2')
    case 3:
    first((select Artikel where number(Nr) = ArtRecord).'Preisgruppe 3')
    case 4:
    first((select Artikel where number(Nr) = ArtRecord).'Preisgruppe 4')
    case 5:
    first((select Artikel where number(Nr) = ArtRecord).'Preisgruppe 5')
    end;
    myPreis
    end;
    let myPG := number(Auftrag.Kunde.Preisgruppe);
    let myArtikel := number(Artikel.Nr);
    Preis := GetPrice(myPG, myArtikel)
    end

    Ich hätte mit der Funktion halt gerne den Feldnamen mitgeben können, da ich im weiteren Skript evtl. auf einen Staffelpreis (z.B. 'Artikel'.'Staffelpreis'.'Preisgruppe 1') zurückgreifen muss. Da ich in einem Skript (nach Eingabe/Änderung der Menge) jeweils nur einmal den Preis der Kunden-Preisgruppe ermitteln, werde ich wohl doch auf die case-switch-Konstruktion ohne Funktion zurückgreifen, ist schlussendlich weniger Code.

     

    Danke für's Mitdenken!

     

    lg, Torsten

Content aside

  • vor 4 JahrenZuletzt aktiv
  • 9Antworten
  • 2548Ansichten