<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Sto generando nuove colonne aggiungendo alcune colonne. Le colonne da aggiungere, ottengo i nomi da un file e costruisco i nomi come un elenco di array. I nomi delle colonne e il numero di colonne potrebbero cambiare. Quando il numero di colonne cambia, devo modificare la formula per riflettere la modifica. Usando l'elenco degli array dei nomi delle colonne, c'è un modo per aggiungerli dinamicamente nella formula, senza dover specificare ogni colonna che voglio aggiungere,
dt=tabella dati corrente();
Cols=Array associativo();
Cols["A1"]={ColA, ColB, ColC};
Cols["A2"]={ColE, ColF, ColG};
Cols["abc"]={"Total1", Total2};
newcolEspr = Espr (
dt << Nuova colonna(Conteggi["abc"][1], Numerico, Continuo, Formula( If(Espr(Cols["A1"][1]) + Espr(Cols["A1"][2]) + Espr(Cols["A1"][3]) > 0,1,0)));
dt << Nuova colonna(Conteggi["abc"][2], Numerico, Continuo, Formula( If(Espr(Cols["A2"][1]) + Espr(Cols["A2"][2]) + Espr(Cols["A2"][3]) > 0,1,0)));
);
Eval(Eval Expr(newColExpr));
Gradirei qualsiasi suggerimento per il mio problema.
Grazie!
Ci sono un paio di notazioni che puoi usare che spesso possono aiutare jsl dinamico più leggibile:
Se hai bisogno di includere le virgolette nelle stringhe, invece di usare la notazione \!" che diventa noiosa, inizi la stringa con "\[ ... quindi tutti i successivi caratteri di escape non hanno bisogno del carattere \! notazione - finisci la stringa con ]"
Per esempio:
str = "\[ "Ciao mondo" ]\";
mostra(str);
mostra(Analizza(str))
In secondo luogo, se stai costruendo un comando jsl in modo dinamico utilizzando variabili, puoi utilizzare la funzione EvalInsert che ti consente di inserire una variabile utilizzando la notazione ^my_variable^.Ciò evita la necessità di utilizzare SubstituteInto.
Combinando i due metodi è possibile eseguire il wrapping del codice dinamico utilizzando il seguente pattern:
Eval(Analizza(EvalInsert("\[
jsl qui usando la notazione ^var^ per la sostituzione
]\")));
Per esempio:
Cancella Globali();
// Crea una tabella di esempio
dt = Nuova tabella( "prova",
Aggiungi righe ( 3 ),
Nuova colonna( "A", Numerico, Continuo, Formato( "Migliore", 1 ), Imposta valori( [0, 1, 1] ) ),
Nuova colonna( "B", Numerico, Continuo, Formato( "Migliore", 12 ), Imposta valori( [0, 2, 2] ) ),
Nuova colonna( "C", Numerico, Continuo, Formato( "Migliore", 12 ), Imposta valori( [0, 3, 3] ) )
);
//definisce l'array dei criteri
Cols = Array associativo();
Cols["A1"] = {"A", "B", "C"};
Cols["abc"] = {"Totale1", "Totale2"};
// Crea sottostringhe in modo iterativo
Eval(Analizza(EvalInsert("\[
s1 = Col["A1"][1];
]\")));
For( i = 2, i <= N elementi( Cols["A1"] ), i++,
Eval(Analizza(EvalInsert("\[
s1 = s1 || "+" || Col["A1"][^i^]
]\")));
);
Eval(Analizza(EvalInsert("\[
newcol_s1 = dt << Nuova colonna( Cols["abc"][1],
numerico, continuo,
formula( Se (^s1^ > 0, 1, 0 ) )
]\")));
Un modo per creare dinamicamente espressioni da stringhe. Rispetto alle espressioni, penso che le stringhe siano più facili da manipolare.
Qui un esempio. "Deve" essere un modo più semplice ma funziona.
Cancella Globali () ;
// Crea una tabella di esempio
dt = Nuova Tavola ( "test" ,
Aggiungi righe ( 3 ) ,
Nuova Colonna ( "UN" , Numerico , Continuo , Formato ( "Migliore" , 1 ) , Imposta valori ( [ 0 , 1 , 1 ] ) ) ,
Nuova Colonna ( "B" , Numerico , Continuo , Formato ( "Migliore" , 12 ) , Imposta valori ( [ 0 , 2 , 2 ] ) ) ,
Nuova Colonna ( "C" , Numerico , Continuo , Formato ( "Migliore" , 12 ) , Imposta valori ( [ 0 , 3 , 3 ] ) ) ,
Nuova Colonna ( "D" , Numerico , Continuo , Formato ( "Migliore" , 12 ) , Imposta valori ( [ 4 , 0 , 4 ] ) ) ,
Nuova Colonna ( "E" , Numerico , Continuo , Formato ( "Migliore" , 12 ) , Imposta valori ( [ 5 , 0 , 5 ] ) ) ,
Nuova Colonna ( "F" , Numerico , Continuo , Formato ( "Migliore" , 12 ) , Imposta valori ( [ 6 , 0 , 6 ] ) )
) ;
//definisce l'array dei criteri
Col = matrice associativa () ;
Col [ "A1" ] = { UN , B , C } ;
Col [ "A2" ] = { D , E , F } ;
Col [ "abc" ] = { "Totale1" , "Totale2" } ;
// Crea sottostringhe in modo iterativo
s1 = "Espr(Cols[\!"A1\!"][1])" ;
Per ( io = 2 , io <= N articoli ( Col [ "A1" ] ) , io ++,
s1 = s1 || "+" || Sostituire ( "Espr(Cols[\!"A1\!"][_i_])" , Espr ( _io_ ) , Car ( Valutazione ( io ) ) )
) ;
s2 = "Espr(Cols[\!"A2\!"][1])" ;
Per ( io = 2 , io <= N articoli ( Col [ "A2" ] ) , io ++,
s2 = s2 || "+" || Sostituire ( "Espr(Cols[\!"A2\!"][_i_])" , Espr ( _io_ ) , Car ( Valutazione ( io ) ) )
) ;
// Stringhe che rappresentano espressioni, sostituire _s_ per sottostringhe
newcol_s1 = "dt << Nuova colonna( Cols[\!"abc\!"][1], Numerico, Continuo, Formula( If( _s_ > 0, 1, 0 ) ) )" ;
Sostituisci in ( newcol_s1 , Espr ( _S_ ) , s1 ) ;
newcol_s2 = "dt << Nuova colonna( Cols[\!"abc\!"][2], Numerico, Continuo, Formula( If( _s_ > 0, 1, 0 ) ) )" ;
Sostituisci in ( newcol_s2 , Espr ( _S_ ) , s2 ) ;
// Analizza stringhe complete
e1 = Analizza ( newcol_s1 ) ;
e2 = Analizza ( newcol_s2 ) ;
// Crea nuove colonne valutando la sottostringa expr e quindi le espressioni complete.
Valutazione ( Espr ( e1 ) ) ;
Valutazione ( Espr ( e2 ) ) ;