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
-
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.
-
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.
-
Hallo Copytexter,
danke, ich hab's befürchtet.
Könnte ich denn mit
Artikel.PG(Kunde)
ebenso wie mitArtikel.Staffelpreis.PG(Kunde)
auf den Feldnamen zurückgreifen, wenn mir die FunktionPG(Kunde)
diesen alstext(Preisgruppe)
liefert?Ich sehe schon, ich muss mich doch mal mit dem bisher von mir vernachlässigten Thema Funktionen befassen. ;)
lg, Torsten
-
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)
-
Hallo Copytexter,
danke für den Steigbügel - ich werd's später mal versuchen umzusetzen und vom Ergebnis berichten.
lg, Torsten
-
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?
-
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
-
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.
-
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 5 JahrenZuletzt aktiv
- 9Antworten
- 2555Ansichten