J'ai une table de données composée de plusieurs lignes de mesures individuelles en série que je découpe avant d'effectuer une fonction de fractionnement de table, mais j'ai un problème avec certaines mesures redondantes que je voudrais supprimer mais le code actuel I que j'utilise est extrêmement lent et probablement inefficace pour ce dont j'ai besoin.
Informations d'arrière-plan:
- Chaque ligne est le résultat d'une mesure automatisée individuelle sur un morceau de matériau effectuée en série et produit un rapport avec les colonnes suivantes :
- Un ID de pièce unique attribué à chaque pièce de matériau [ PartID ]
- L'ID de lot associé à la matière première utilisée pour créer la pièce de matériau individuelle [LotID]
- La valeur de mesure réelle pour la mesure effectuée [ Valeur ]
- Résultat de mesure attribué en fonction de la valeur de mesure (réussite/échec/reprise) [Résultat]
- Horodatage de la mesure [ Date_Created ]
Mon équipement produit des dizaines de lignes de mesures par pièce de matériau et traite des milliers de pièces de matériau par rapport. Ces rapports sont ensuite introduits dans JMP en tant que tableau de données d'origine.Chaque rapport contient également plusieurs lots, de sorte que la table de données a plusieurs références à "PartID = 1" car chaque lot reçoit un numéro séquentiel commençant à 1, donc je dois utiliser à la fois PartID et LotID pour faire référence à un morceau donné de matériel.Dans le cas où le résultat est "Retravailler", l'équipement de mesure arrête toute autre mesure sur ce morceau de matériau individuel, réoriente le morceau de matériau et le renvoie au début de la ligne en re-mesurant tous les tests précédents sur le matériau tout en conservant le même ID de pièce unique associé à la pièce de matériau.
Résultat souhaité:
Je souhaite utiliser un script pour parcourir le tableau de données et éliminer toutes les mesures jusqu'au (et y compris) le résultat de la reprise, car après la reprise, toutes les mesures sont répétées et la reprise peut affecter les valeurs de mesure.Pour ce faire, j'utilise actuellement le script JSL pour parcourir chaque ligne et procéder comme suit :
- Identifiez si le résultat est "Retravailler" ; si c'est le cas, procédez comme suit :
- Identifiez le PartID pour le morceau de matériau donné comme "xPartID"
- Identifiez le LotID pour le morceau de matériel donné comme "xLot"
- Identifiez le Date_Created pour la mesure donnée comme "xDate"
- Sélectionnez et supprimez toutes les lignes où (PartID = xPartID) et (LotID = xLot) et (Date_Created <= xDate)
- Si le résultat n'est pas "Retravailler", alors sortez de la boucle, pas besoin de continuer.
Je continue d'avoir des ralentissements extrêmes et, fondamentalement, le code conduit à planter le programme.Si je l'exécute étape par étape, cela semble fonctionner, mais si on le laisse courir, il finit par mourir. Voici le code réel :
//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>Je suis sur JMP 16.2.0 (570548).