Sortiernen in Arrys
Hallo liebes Forum
ich stelle gerade von FM auf Ninox um und habe folgendes Problem:
ich bilde ein Arry und möchte diese nach der Lieferantnummer sortieren! Wenn dann die Lieferantennr. sich ändert wird einen neuer Beleg angelegt! Ich bekomm das aber leider einfach nicht hin :-(
mein Code
"
/ Bestellbereit /
// Artikelstatus = 2
// Formularnummer = 5
";
let bNr := Nr;
let kNr := null;
let pNr := null;
for i in (select Belegpositionen)[Beleg = bNr and Beleg.Belegpositionen.Ware.'Artikel-Status' = 1 or Beleg.Belegpositionen.Ware.'Artikel-Status' = 4] do
jetzt sollte er sortieren nach der Verknüpfung Kontakt! aber wie?
if kNr != i.Ware.Artikelvorlage.Lieferant then
let bNr := (create Beleg);
bNr.(Belegart := 5);
bNr.(Belegdatum := today());
bNr.(Kontakt := i.Ware.Artikelvorlage.Lieferant);
bNr.(Kontaktperson := first(i.Ware.Artikelvorlage.Lieferant.Person));
let kNr := i.Ware.Artikelvorlage.Lieferant;
let pNr := null;
let pNr := (create Belegpositionen);
pNr.(EK := i.EK);
pNr.(VK := i.VK);
pNr.(Ware := i.Ware);
pNr.(Kreislauf := i.Kreislauf);
pNr.Ware.('Artikel-Status' := 2);
pNr.(Bemerkung := i.Bemerkung);
pNr.(Beleg := bNr)
else
let pNr := (create Belegpositionen);
pNr.(EK := i.EK);
pNr.(VK := i.VK);
pNr.(Ware := i.Ware);
pNr.(Kreislauf := i.Kreislauf);
pNr.Ware.('Artikel-Status' := 2);
pNr.(Bemerkung := i.Bemerkung);
pNr.(Beleg := bNr)
end
end
Wer kann mir helfen?
Grüße Michael
11 Antworten
-
bitte bitte
-
Hallo Michael,
Es ist schwierig ohne Datenmodell. Was mir aufgefallen ist, du hast in der Schleife viel zu viel Felder (vermutlich nicht geschrieben sonder auf das Feld links geklickt). Die Formel für die Schleife wäre dann:
---
for i in (select Belegpositionen)[Beleg = bNr and (Ware.'Artikel-Status' = 1 or Ware.'Artikel-Status' = 4)] do
---
Leo
-
ja du hast recht Leo mit den Feldern!
Frage wenn ich das Array so gebildet habe
"for i in (select Belegpositionen)[Beleg = bNr and (Ware.'Artikel-Status' = 1 or Ware.'Artikel-Status' = 4)] do"
wir kann ich das Arry noch dem Feld Kontakt (datenfeld von Belegpositionen) sortieren oder muss die Arry anderes generiert werden?
Ich möchte die Belegpositioen weiterleiten und wenn sicher der Kontakt ändern einen neuen Beleg erzeugen und die weiteren Positionen dann diesem Beleg zuordnen. In Filemaker habe ich immer eine Auswahl erzeugt sie dann sortiert und dann weitergeleitet!
Wenn ich die Positionen nicht sortieren kann es sein, dass evtl. mehrere Belege für den Kontakt angelegt werden!
Gruß Michael
-
ich versuche es mal mit einer Doppelschleife !
-
Hallo Michael,
Mit der select .... erstellst nocht keinen Array sondern filterst die Tabelle nach deinen Kriterien. Wenn du die gefilterte Tabelle in der Schleife noch nach Kontakt sortieren möchtest, dann sollte die Formel etwa so aussehen:
---
for i in (select Belegpositionen)[Beleg = bNr and (Ware.'Artikel-Status' = 1 or Ware.'Artikel-Status' = 4)] order by Kontakt do
---
Dabei werden die Datensätze nach Kontakt ID sortiert.
Leo
-
Aaaah dann teste ich so mal weiter, vielen Dank
-
Hey Leo,
gibt's zu dem "order by" auch ein Gegenstück, d.h. wenn ich absteigend sortieren will? Ich such' mir im Forum und Handbuch 'nen Wolf... :-/
lg, Torsten
-
Hallo Torsten,
nicht das ich wüsste. Als Workaround kann man zuerst einen Array aus Indikatoren bilden, dann den Array mit rsort () absteigend sortieren und dann schon die Datensätze zuordnen:
---
let myTable:=select Tabelle;
let myArray:=myTable.Indikator;
let myDescending:=rsort(myArray);
for i in myDescending do
first (myTable[Indikator=i])........
end
---
so kannst du die Tabelle auch absteigend nach deinem Kriterium durchlaufen
Leo
-
Hallo Leo,
danke für die Rückmeldung und den Lösungsvorschlag - so ganz bekomm ich die Lösung nicht auf meine Aufgabe umgesetzt. Vielleicht hast Du eine Idee?
Ich habe eine Tabelle 'Verkauf' für Aufträge mit einer Untertabelle 'Verkaufsposition'. In 'Verkaufsposition' gibt es per Auswahlfeld 'Auswahl' "Artikel" (1), "Textposition" (2) oder "Zwischensumme" (3). Die Verkaufspositionen sortiere ich je Auftrag per Pos_ID (Du erinnerst Dich an den anderen Thread zu dem Thema? ;-). Nun soll eine Verkaufsposition mit der Auswahl "Zwischensumme" die vorherigen Verkaufspositionen des Typs "Artikel" addieren - aber (falls vorhanden) eben nur bis zur nächstkleineren Position mit der Auswahl "Zwischensumme". Hier mein funktionales Skript für die Summe aller Artikel bis zum Anfang:
let my := Pos_ID;
let myDok := Verkauf;
sum((select Verkaufsposition)[Auswahl = 1 and Verkauf = myDok and Pos_ID < my].'Positions-Summe')
lg, Torsten
-
Hallo Torsten,
so als Berchnungsfeld:
---
if Auswahl = 3 then
let my := this;
if cnt(Verkauf.Verkaufsposition[Pos_ID < my.Pos_ID and Auswahl = 3]) = 0 then
sum(Verkauf.Verkaufsposition[Pos_ID < my.Pos_ID and Auswahl = 1].'Positions-Summe')
else
let myPOS := max(Verkauf.Verkaufsposition[Pos_ID < my.Pos_ID and Auswahl = 3].Pos_ID);
sum(Verkauf.Verkaufsposition[Pos_ID > myPOS and Pos_ID < my.Pos_ID and Auswahl = 1].'Positions-Summe')
end
end
---
Leo
-
Hallo Leo,
örgs, auf max() bin ich partout nicht gekommen - hab viel zu kompliziert gedacht.
Vielen Dank!
lg, Torsten
Content aside
- vor 5 JahrenZuletzt aktiv
- 11Antworten
- 3139Ansichten