Hallo zusammen,
Ich versuche, ein Dialogfenster mit mehreren Listenfeldern zu erstellen, die alle Werte einer entsprechenden Spalte in einer Datentabelle enthalten. Nach Auswahl eines oder mehrerer Elemente in einer der Listen möchte ich, dass die Elemente in den verbleibenden Listen entsprechend dieser Auswahl gefiltert werden. Ich habe das implementiert, was ich gerade unten beschrieben habe, aber hier ist die Sache: Wenn ich das Dialogfenster in einer Schleife fülle, anstatt die Listenuntermengenindizes mit Ganzzahlen wie unten fest zu codieren, wird die Funktion mit dem aktuellen Wert von i zum Zeitpunkt von aufgerufen Ausführung anstelle des Werts, der beim Erstellen der Listbox in der Schleife verwendet wurde. Ich habe die Skriptanleitung gelesen und verschiedene Optionen ausprobiert, darunter Eval (Eval Expr (Expr ())) und Eval Substitute (Expr (), Expr ())), aber ich kann sie nicht zum Laufen bringen. Ich bin jetzt darauf angewiesen, den gesamten Ausdruck als lange Zeichenfolge in einer Schleife zu erstellen und Eval (Parse ()) ihn zu erstellen, aber das scheint einfach albern. Kann mir hier jemand mit der richtigen Syntax helfen?
Vielen Dank,
Johan
Names Default To Here( 1 );
If( !Namespace Exists( "fq" ),
New Namespace(
"fq"
)
);
dt = New Table( "Sample data",
Add Rows( 9 ),
New Column( "id",
Character,
"Nominal",
Set Values( {"a", "a", "a", "b", "b", "b", "c", "c", "c"} )
),
New Column( "value",
Character,
"Nominal",
Set Values( {"A", "B", "C", "D", "E", "F", "G", "H", "I"} )
),
New Column( "val2",
Character,
"Nominal",
Set Values( {"one", "two", "three", "one", "two", "three","one", "two", "three"} )
)
);
filterSelected = Function( {dt, values, index},
/*
Sorts displayed values in all list boxes based on selection
*/
columns = fq:filterColumns;
filters = fq:filters;
selectedColum = Remove From( columns, index )[1];
selctedFilter = Remove From( filters, index )[1];
rows = dt << Get rows where( Contains( values, as Column( dt, selectedColum ) ) );
// If nothing is selcted, all values should be chosen
If(Length(values)==0,
rows = dt << get rows where(!Ismissing(As Column(dt, selectedColum)))
);
// Set list items according to selection
Local( {j = 1},
For( j = 1, j <= N Items( filters ), j++,
filters[j] << Set items( Column( dt, columns[j] )[rows] )
)
);
);
getSelection = Function( {},
Local( {j =1},
For( j=1, j <= N Items(fq:filters), j++,
print(fq:filterColumns[j], fq:filters[j] << get items());
);
);
);
nestedFilters = Function( {filtercolumns},
fq:filtercolumns = filtercolumns;
dialog = New Window( "Fetch rows matching:",
Show Menu( 0 ),
show toolbars( 0 ),
Border Box( Top( 20 ), Bottom( 20 ), Left( 10 ), Right( 10 ),
V List Box(
Align( right ),
filter_boxes = V List Box(),
H List Box(
ok_button = Button Box( "OK" ),
cancel_button = Button Box( "Cancel", dialog << close window )
)
)
),
ok_button << Set function(
getSelection();
dialog << close window;
)
);
fq:filters = {};
fq:all_rows = {};
//for(i=1, i<=N Items(filtercolumns), i++,
filter_boxes << append( Text Box( fq:filtercolumns[1], <<SET font="" style=""></SET>Versuche dies
for( i = 1, i <= N Items( filtercolumns ), i++,
eval(
evalexpr(
filter_boxes << append( Text Box( fq:filtercolumns[Expr( i )], <<SET font="" style=""></SET>Ich habe den Fall "1" verwendet, die 1 in expr (i) geändert und diese in eval / evalexpr und in die i-Schleife eingefügt.
Vielen Dank für die Chance! Leider habe ich das gleiche Problem wie in der Vergangenheit: Wenn ich eine Auswahl in der Liste treffe, wird die Funktion filterSelected mit dem aktuellen Wert if i (dh 4) aufgerufen, was zu einem Fehler im Indexbereich führt.

Was ich tun kann ist das, aber das scheint nur ... Dumm, denke ich ...
expression = "";
for( i = 1, i <= N Items( fq:filtercolumns ), i++,
expression = expression ||
"filter_boxes << append( Text Box( fq:filtercolumns[" || char(i) || "], <<SET font="" style=""></SET>