Trovare il formato corretto del nome jslCIAO!
Ho creato uno script jsl che è il seguente:
For Each Row(
dt_fichier3,
// Lire la valeur de la colonne "Process" et les offsets
process_value = :Process;
first_offset = :first_OFFSET;
second_offset = :second_OFFSET;
third_offset = :third_OFFSET;
// Vérifier et assigner les valeurs des offsets si elles ne sont pas vides ou "."
If(
(Char(first_offset) != "." & Char(first_offset) != "") | (Char(second_offset) != "." &
Char(second_offset) != "") | (Char(third_offset) != "." & Char(third_offset) != ""),
// Créer une nouvelle colonne dans le fichier1 si elle n'existe pas encore
new_column_name = process_value || "_offset";
dt_fichier1 << New Column(new_column_name, Numeric, Continuous);
// Définir la formule pour la nouvelle colonne
Column(dt_fichier1, new_column_name) << Set Formula(
Eval(
Eval Expr(
If(:Supplier == "FIRST",
:Expr(process_value) + Expr(:first_OFFSET),
If(:Supplier == "SECOND",
:Expr(:Process) + Expr(:second_OFFSET),
If(
:Supplier == "THIRD",
:Expr(:Process) + Expr(:third_OFFSET),
,
:Expr(:Process) // Valeur par défaut si aucun fournisseur ne correspond
)
)
)
)
)
);
);
);
Modifica (2024-08-08 jthi): aggiunta formattazione jsl
il problema è che la formula non funziona perché il nome della colonna appare nelle informazioni sulla colonna->Formula come "Column_name" o dovrebbe essere "Column-name", ho provato a usare la funzione Name() ma non ha funzionato:(
Automazione e scriptingAccesso ai datiEsplorazione e visualizzazione dei datiRe: Trovare il formato corretto del nome jslCostruisci le formule usando la valutazione dell'espressione Inserisci un'espressione in un'altra usando Eval Insert, Eval Expr, Parse e Substitute . Questo è solitamente il mio metodo preferito (o Eval(Substitute()) e NameExpr(AsColumn())
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
col1 = "height";
col2 = "weight";
new_col = Eval(EvalExpr(dt << New Column("mycol", Numeric, Continuous, Formula(
Expr(NameExpr(AsColumn(dt, col1))) * Expr(NameExpr(AsColumn(dt, col2)))
))));
new_col << get formula;Re: Trovare il formato corretto del nome jslGiusto,
Ma ad esempio, dopo aver compilato lo script, se prendo una colonna per vedere come appare la sua formula, ottengo questo:
Se( :Fornitore == "PRIMO",
"Nome_colonna" + 4,
Se( :Fornitore == "SECONDO",
"Nome_colonna" + 5,
Se( :Fornitore == "TERZO",
"Nome_colonna" + (-10),
"Nome_colonna"
)
)
)
Il che non funziona perché dovrebbe essere così per funzionare:
Se( :Fornitore == "PRIMO",
"Nome_colonna"n + 4,
Se( :Fornitore == "SECONDO",
"Nome_colonna"n + 5,
Se( :Fornitore == "TERZO",
"Nome_colonna"n + (-10),
"Nome_colonna"n
)
)
)
Come faccio a modificare il mio script allora? Grazie:)
Re: Trovare il formato corretto del nome jslMancano: dalle tue colonne, nel tuo script originale devi modificare almeno queste :Expr(:Process). Suggerirei anche di usare nomi di colonna invece di riferimenti come process_value = :Process (process_value = "Process" è quello che preferisco usare).
Re: Trovare il formato corretto del nome jslNon ti capisco,
Se utilizzo process_value = "Process", diventerà una stringa e non prenderà il nome della colonna.
Inoltre, cosa devo cambiare in questi :Expr(:Process)?
Re: Trovare il formato corretto del nome jslNella mia risposta precedente ho mostrato una tecnica per trasformare nuovamente queste (stringhe) in colonne all'interno delle formule.
Re: Trovare il formato corretto del nome jslAh... Usare :Process è corretto in quella posizione poiché stai usando il ciclo For Each Row. Si applica comunque lo stesso metodo per convertire quei valori che ottieni dalle colonne in colonne
Re: Trovare il formato corretto del nome jslPotresti applicarlo al mio script, non capisco pls
Re: Trovare il formato corretto del nome jslSe puoi fornirmi le tabelle dei tuoi dati posso fornirti esempi migliori.
Re: Trovare il formato corretto del nome jslEcco i dati
Re: Trovare il formato corretto del nome jslPenso che questo faccia quello che stai cercando. Ho usato Eval(Substitute()) perché di solito è un po' più facile leggere cosa sta facendo direttamente dal codice. Ho anche separato la valutazione dalla creazione dell'espressione, così puoi stamparla se vuoi vedere come appare. I cicli For Each possono anche essere sottoposti a debug impostando la riga corrente su un valore specifico, a patto che tu abbia la tabella corretta come tabella dati corrente.
Names Default To Here(1);
dt1 = Open("$DOWNLOADS/DATAtable1.jmp");
dt2 = Open("$DOWNLOADS/DATAtable2.jmp");
//Row() = 2;
For Each Row(
dt2,
process_value = :Process;
first_offset = :first_OFFSET;
second_offset = :second_OFFSET;
third_offset = :third_OFFSET;
If(
(Char(first_offset) != "." & Char(first_offset) != "") | (Char(second_offset) != "." &
Char(second_offset) != "") | (Char(third_offset) != "." & Char(third_offset) != ""),
new_column_name = process_value || "_offset";
col_expr = Substitute(
Expr(dt1 << New Column(new_column_name, Numeric, Continuous, Formula(
If(:Supplier == "FIRST",
_processval_ + _firstoffset_
, :Supplier == "SECOND",
_processval_ + _secondtoffset_
, :Supplier == "THIRD",
_processval_ + _thirdoffset_
, // else
_processval_
)
))),
Expr(_processval_), Name Expr(AsColumn(dt1, process_value)),
Expr(_firstoffset_), first_offset,
Expr(_secondtoffset_), second_offset,
Expr(_thirdoffset_), third_offset
);
//show(col_expr);
new_col = Eval(col_expr);
);
);
