Formules de colonne à ralentir : comment attendre qu'elles aient fini de calculerSalutations, j'ai rencontré des situations où j'importe des données brutes dans une table de données (dt1), puis j'ouvre une autre table de données qui a des limites de spécification (dt2).Le tableau des limites de spécifications contient uniquement une USL et une LSL.J'insère une nouvelle colonne calculée dans dt2 qui est la limite de spécification cible (mean(USL,LSL)).Je parcoure ensuite toutes les lignes de mes données brutes dt1 et si j'obtiens une correspondance du nom des limites de test et de spécification, puis définissez les propriétés de colonne avec les limites de spécification (par exemple, col << Set Property( "Spec Limits", { LSL( myLSLx ),USL( myUSLx ),Cible( mytargetx ), );)... Fermez ensuite le fichier de spécifications dt2, pas de sauvegarde.
Je pense que le problème que j'ai est que la colonne calculée (dt2:_Target) n'est pas assez rapide, et j'obtiens toutes les valeurs vides en essayant de les lire, juste après avoir créé la nouvelle colonne calculée ("_Target"...).Si je garde le fichier dt2 ouvert, je vois les valeurs correctes dans la colonne calculée "_Target".J'ai joué avec le dt2<< Begin data Update; et cela ne fonctionne pas non plus, mais peut-être que je le mets au mauvais endroit dans le script ?La seule solution que j'ai est de ne pas utiliser de formule pour la nouvelle colonne, mais de calculer dans un script la valeur cible et de la placer dans le fichier spec en indexant toutes les lignes.
La racine de ma question est la suivante : puis-je attendre que toutes les colonnes soient complétées par des calculs avant d'essayer de lire une valeur spécifique dans une ligne/colonne ?
Ne marche pas
Par exemple,
New Column( "_Target",Numeric,"Continuous",Format( "Best", 12 ),Formula(If( Is Missing( :_LSL ) | Is Missing( :_USL ),
Empty(),
Mean( :_LSL, :_USL )
)
solution de contournement
Par exemple,
dt2 = current data table();
New Column( "_Target", Numeric, "Continuous");
dt2_rows = nrows();
for (i=1, i<=dt2_rows, i++,
if(or(!is missing(dt2:_LSL[i]),!is missing(dt2:_USL[i])),
dt2:_Target[i] = ((dt2:_LSL[i]) + (d2t:_USL[i])) / 2;
,
);
Re: Formules de colonne à ralentir : comment attendre qu'elles aient fini de calculerIl s'agit d'un simple "pile sur" commentaire.@txnelson La formule de sera plus grasse que celle que vous avez fournie.Les formules de colonne s'exécutent plus rapidement qu'une boucle for. De plus, l'instruction conditionnelle n'est pas requise, car JMP renvoie une valeur empty() dans tout calcul contenant une valeur vide. Ainsi, (:USL + :LSL)/2 sera vide si une ou les deux valeurs sont vides.
Ceci est juste un FYI.
Re: Formules de colonne à ralentir : comment attendre qu'elles aient fini de calculerVous avez raison de dire que ce message n'est pas décrit dans le Guide de script. Il est décrit dans le Guide de syntaxe JSL. Le premier livre n'est pas une description complète de chaque fonction et message dans JSL mais le deuxième livre devrait être complet. Les deux livres sont destinés à se compléter et à être utilisés ensemble.
Le message est également couvert par l'index de script, avec un lien vers l'aide correspondante. Une recherche de "formule" renverrait une liste comprenant les messages << Exécuter les formules et << Relancer les formules.
Re: Formules de colonne à ralentir : comment attendre qu'elles aient fini de calculerN'était pas au courant de "relancer" non plus. On dirait que cela fait réévaluer les formules, qu'elles en aient besoin ou non. Si vous utilisez des nombres aléatoires dans vos formules, vous pouvez voir la différence. Je recommanderais <
Re: Formules de colonne à ralentir : comment attendre qu'elles aient fini de calculerNice, cela fonctionne aussi. Les formules de réexécution ne figurent pas dans le guide de script JMP V13, contrairement aux formules d'exécution. Les deux fonctionnent dans ce cas.Re: Formules de colonne à ralentir : comment attendre qu'elles aient fini de calculerGénial! Ça marche!Re: Formules de colonne à ralentir : comment attendre qu'elles aient fini de calculerVous trouverez ci-dessous une modification simple qui devrait fonctionner pour vous.Premièrement, en se débarrassant de la clause If(), cela accélérera le traitement, et deuxièmement, le
dt << relancer les formules ;
forcera JMP à terminer le traitement des formules avant de continuer
dt = Current Data Table();
dt << New Column( "_Target",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( (:LSL + :USL) / 2 )
);
dt << rerun formulas;
Re: Formules de colonne à ralentir : comment attendre qu'elles aient fini de calculerEssayez d'envoyer un message "Exécuter les formules" à votre table :
dt << runFormulas;