Ciao a tutti,
Sto cercando di costruire una finestra di dialogo con diverse caselle di riepilogo, ciascuna contenente tutti i valori di una colonna corrispondente in una tabella di dati. Dopo aver selezionato uno o più elementi in uno qualsiasi degli elenchi, desidero filtrare gli elementi negli elenchi rimanenti in base a tale selezione. Ho implementato ciò che ho appena descritto di seguito, ma ecco il punto: se popolo la finestra di dialogo in un ciclo invece di codificare gli indici del sottoinsieme di elenchi con numeri interi come sotto, la funzione viene chiamata con il valore corrente di i al momento esecuzione invece del valore utilizzato quando la casella di riepilogo è stata creata nel ciclo. Ho letto la guida allo scripting e provato diverse opzioni tra cui Eval (Eval Expr (Expr ())) e Eval Substitute (Expr (), Expr ())) ma non riesco a farlo funzionare. Ora sono pronto a costruire l'intera espressione come una lunga stringa in un ciclo e Eval (Parse ()) 'ing, ma sembra sciocco. Qualcuno può aiutarmi con la sintassi corretta qui?
Grazie,
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>Prova questo
for( i = 1, i <= N Items( filtercolumns ), i++,
eval(
evalexpr(
filter_boxes << append( Text Box( fq:filtercolumns[Expr( i )], <<SET font="" style=""></SET>Ho usato il caso "1", ho cambiato 1s in expr (i), l'ho inserito all'interno di eval / evalexpr, all'interno del ciclo i.
Grazie per averci provato! Sfortunatamente ricevo lo stesso problema che avevo dovuto affrontare in passato: quando effettuo una selezione nell'elenco, la funzione filterSelected viene chiamata con il valore corrente se i (cioè 4), risultando in un errore di intervallo di pedici.

Quello che posso fare è questo, ma sembra che ... Sciocco immagino ...
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>