Creazione di colonne formula in un ciclo ForHo uno script che calcola le percentuali di non conformità per i codici di non conformità e crea anche grafici di controllo per ogni codice su un intervallo di date inserito dall'utente. L'utente può inserire fino a cinque codici individuali e ci sono oltre 50 codici tra cui scegliere. È stata creata una tabella con la quantità totale non conforme per codice per data, la somma delle quantità non conformi di tutti i codici immessi e la quantità totale prodotta al giorno (Tasso NC per data per codice - Originale). Quindi aggiungo alla tabella iterando attraverso un ciclo per aggiungere una colonna per calcolare il tasso di non conformità per ciascun codice e quindi un secondo per visualizzare il tasso come percentuale (Tasso NC per data per codice - Completo). Al momento tutte le colonne rate sono identiche e le colonne di precentage non sono la versione percentuale corretta della percentuale.
Il ciclo è sostanzialmente identico a quello creato alla fine dello script per riassumere i dati di non conformità nell'intero intervallo di date (Numero complessivo di NC per codice - Originale, Velocità generale per codice - Completo) che calcola correttamente e non posso dì cosa sta andando storto.
Ho attaccato schermate delle tabelle indicate e delle sezioni degli script (codici = elenco di tutti i codici inseriti come stringhe, SD e NR sono riferimenti tabella)
//NC Rate By Date Per Code Section
//Calculate NC rates and percentages for entered codes if two or more codes are entered
If(NItems(codes)>=2,
For(c=2, c<=NItems(codes)+1, c++,
//Add NC Rate column for each code
NR<<NEW column="">=2,
For(c=2, c<=NItems(codes)+1, c++,
//Add NC Rate column for each code
SD<<NEW column=""></NEW></NEW>Ri: Creazione di colonne di formula in un ciclo For @rfeick ,
C'è una differenza tra le fomule delle ultime due colonne e quelle create all'interno del tuo ciclo for. Le ultime due colonne fanno riferimento alla colonna effettiva per eseguire l'elaborazione.
Dovresti esaminare alcune delle formule delle colonne create dalla specifica del ciclo for (vedi sotto)
NR<<NEW column=""></NEW>
La formula sarà simile a questa, non avrà il valore di c quindi il risultato che otterrai sarà il risultato del valore finale di c.
<SPAN class="token function">Round</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token function">Column</SPAN><SPAN class="token punctuation">(</SPAN>c<SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">[</SPAN><SPAN class="token punctuation">]</SPAN> <SPAN class="token operator">/</SPAN> <SPAN class="token punctuation">:</SPAN>Manufactured Qty<SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">,</SPAN> <SPAN class="token number">4</SPAN><SPAN class="token punctuation">)</SPAN>
Se salvi questa tabella e successivamente la apri in una nuova sessione JMP e riesegui le formule, quelle colonne saranno vuote, JMP non conoscerà il valore di c.
È necessario modificare la formula per utilizzare un'espressione che sostituisce il valore di c o modificare lo script per memorizzare i valori calcolati anziché la formula. Il codice sottostante mostra come usare Set Each Value () per memorizzare i valori e non le formule.
tcol = NR<<NEW column=""></NEW>
Ri: Creazione di colonne di formula in un ciclo For, Grazie per la spiegazione. Ho provato il metodo Imposta ogni riga e risolto il problema che stavo riscontrando durante il calcolo dei tassi di non conformità al giorno. L'unico punto su cui sono ancora confuso è come ha funzionato la stessa teoria in una sezione della sceneggiatura, ma non nell'altra?Ri: Creazione di colonne formula in un ciclo For @rfeick ,
Lo script seguente ti aiuterà a capire che a partire da JMP14 l'utilizzo di una variabile in una colonna formula può produrre risultati errati perché quando il valore della variabile cambia, cambiano le formule (e i suoi valori).
Per quanto riguarda le ultime due formule nel tuo script:
Esegui lo script di seguito come descritto. Dimostra cosa sta succedendo nelle formule della tua tabella, e quindi i valori. Questo script include anche un metodo per sostituire la variabile nella formula con il valore delle variabili utilizzando le espressioni. In genere uso Set Each Value (), quindi se la colonna di origine viene eliminata la colonna è intatta. Si noti inoltre che questo script utilizza c il numero della colonna. Se volessi incorporare la formula, ti consiglio di creare una nuova variabile cnme = Colonna (c) << ottieni nome , quindi usa Column (cnme) ed espressioni. Quindi se la tabella viene riorganizzata, ecc. la formula è come previsto (intatto). Lo script visualizzato di seguito è allegato.
Names Default to Here(1);
dt = Open("$Sample_Data/Big Class.jmp");
//will create formula columns for height and weight using a relative column number , c
//c will change, simulating a loop.
//highlight the blocks of code and follow the instructions
//--- Block 0: run this to embed the log window
_cw = Current Window();
_ifb = _cw << Find( If Box( 1 ) );
wait(0);
_ifb << Set( 1 );
//--- end Block 0
//--- Block 1: run it and look at the look at the embedded log
c=4; //height
dt << New Column( (column(c) << get name) ||" per age", Numeric, Continuous, Formula(Round(column(c)[] /:age,2) ) );
nc1 = ncol(dt);
show( c, nc1, (column(nc1) << get formula), column(nc1)[1::5]);
//--- end Block 1
//--- Block 2: run it and look at the look at the embedded log
c=5; //weight
dt << rerun formulas;
nc1 = ncol(dt);
show( c, nc1, (column(nc1) << get formula), column(nc1)[1::5]);
//--- end Block 2 See the log, the formula is the same, but c has changed so the formula is now using column 5 (c=5)
// for its calculation
//--- Block 3: run it and look at the look at the log
c=5; //height
dt << New Column( (column(c) << get name) ||" per age", Numeric, Continuous, Formula(Round(column(c)[] /:age,2) ) );
nc2 = ncol(dt);
show( c, nc2, (column(nc2) << get formula), column(nc2)[1::5]); //same formula as nc1
show(column(nc1)[1::5], column(nc2)[1::5]);
//--- end Block 3
//will use formula columns for weight and height using expressions column number
//--- Block 4: run it and look at the look at the log
c=4; //height
Eval ( Eval Expr(
dt << New Column( (column(c) << get name) ||" per age using expr", Numeric, Continuous, Formula(Round(column(expr(c))[] /:age,2) ) )
));
nc3 = ncol(dt);
show( c, nc3, (column(nc3) << get formula), column(nc3)[1::5]);
//--- end Block 4 - note the formula now has the exact column number, it no longer relies on "c"
//--- Block 5: run it and look at the look at the log
c=5; //height
Eval(EvalExpr(
dt << New Column( (column(c) << get name) ||" per age using expr", Numeric, Continuous, Formula(Round(column(Expr(c))[] /:age,2) ) );
));
nc4 = ncol(dt);
show( c, nc4, (column(nc4) << get formula), column(nc4)[1::5]); //not the same formula as nc3,
show(column(nc3)[1::5], column(nc4)[1::5]);
//--- end Block 5
Ri: Creazione di colonne formula in un ciclo ForGrazie per la spiegazione aggiuntiva!