Ho una tabella di dati composta da più righe di singole misurazioni in serie su cui sto ritagliando prima di eseguire una funzione di divisione della tabella, tuttavia ho un problema con alcune misurazioni ridondanti che vorrei rimuovere ma il codice corrente I sto usando è estremamente lento e probabilmente inefficiente per quello di cui ho bisogno.
Informazioni di base:
- Ogni riga è il risultato di una singola misurazione automatizzata su un pezzo di materiale eseguita in serie e produce un report con le seguenti colonne:
- Un ID parte univoco assegnato a ogni singolo pezzo di materiale [PartID]
- L'ID lotto associato alla materia prima utilizzata per creare il singolo pezzo di materiale [LotID]
- Il valore di misurazione effettivo per la misurazione eseguita [Valore]
- Risultato della misurazione assegnato in base al valore della misurazione (Passato/Fallito/Rilavorazione) [ Risultato ]
- Timestamp della misurazione [Data_creata]
La mia attrezzatura produce dozzine di righe di misurazioni per pezzo di materiale ed elabora migliaia di pezzi di materiale per rapporto: tali rapporti vengono quindi inseriti in JMP come tabella dati originale.Ogni report contiene anche più lotti, quindi la tabella dei dati ha più riferimenti a "PartID = 1" perché a ogni lotto viene assegnato un numero sequenziale che inizia da 1, quindi è necessario utilizzare sia PartID che LotID per fare riferimento a un determinato pezzo di materiale.Nel caso in cui il risultato sia "Rilavorazione", l'apparecchiatura di misura interrompe qualsiasi ulteriore misurazione su quel singolo pezzo di materiale, riorienta il pezzo di materiale e lo riporta all'inizio della linea rimisurando tutte le prove precedenti sul materiale ma mantenendo lo stesso ID parte univoco associato al pezzo di materiale.
Risultato desiderato:
Desidero utilizzare lo script per scorrere la tabella dei dati ed eliminare tutte le misurazioni fino al risultato della rielaborazione (incluso), poiché dopo la rielaborazione tutte le misurazioni vengono ripetute e la rielaborazione può influire sui valori di misurazione.Per fare ciò sto attualmente utilizzando lo script JSL per scorrere ogni riga e fare quanto segue:
- Identificare se il risultato è "Rilavorazione"; in tal caso, procedere come segue:
- Identificare il PartID per il dato pezzo di materiale come "xPartID"
- Identificare il LotID per il dato pezzo di materiale come "xLot"
- Identifica la Date_Created per la misurazione data come "xDate"
- Seleziona ed elimina tutte le righe in cui (PartID = xPartID) e (LotID = xLot) e (Date_Created <= xDate)
- Se il risultato non è "Rilavorazione", allora esci dal ciclo, non c'è bisogno di continuare.
Continuo ad avere rallentamenti estremi e fondamentalmente il codice porta al crash del programma.Se lo eseguo passo dopo passo sembra funzionare, ma se lasciato per eseguirlo alla fine muore. Ecco il codice effettivo:
//Recoding the two potential "Rework" results into a shared value "aRework"; putting the letter "a" in front of it so if I sort by the column ascending then all of these values are at the start of the list, to hopefully make it easier and faster to process them.
dt << Recode Column(
dt:result,
{Map Value(
_rcOrig,
{"FailOnHighRework", "aRework",
"FailOnLowRework", "aRework"},
Unmatched( _rcNow )
)},
Update Properties( 1 ),
Target Column( :result )
);
//Sorting the table using the result column after the recode, so all of the rework rows are at the start of the table
SortColumn = "result";
dt << Sort( By( :result ), Replace Table, Order( Ascending ), Suppress formula evaluation( 1 ) );
//now run the row-by-row script
dt << begin data update;
for each row(
If( :result == "aRework",
xRow = Row();
xPartID=:PartID[Row()];
xLot=:lot[Row()];
xDate=:date_created[Row()];
dt <<SELECT where=""></SELECT>Sono su JMP 16.2.0 (570548).