0

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

null
    • Michael_Reichardt
    • vor 5 Jahren
    • Gemeldet - anzeigen

    bitte bitte

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Michael_Reichardt
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Michael_Reichardt
    • vor 5 Jahren
    • Gemeldet - anzeigen

    ich versuche es mal mit einer Doppelschleife !

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Michael_Reichardt
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Aaaah dann teste ich so mal weiter, vielen Dank 

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

    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

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

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

    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

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

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

    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