Enregistrements et fichiers : Scripters Club sur l'accès aux données, la torréfaction JMP et les trucs et astucesVidéo 1 Accès aux données de @Georg
Commentaires:
- Même si la documentation fait encore défaut et qu'elle peut être un peu compliquée à utiliser... Je vous suggère quand même de l'utiliser car c'est la méthode préférée et elle prendra en charge (et prend en charge) les connecteurs
- Il existe également le « symbole » queryResult auquel vous pouvez accéder une fois l'exécution terminée et qui devrait être la référence à la table résultante
- Utilisez toujours soit < << run foreground and do not rely on which is determined by user preferences< pan>

Vidéo 2 : JMP Roasting fro, @jthi
Commentaires:
- Je recommanderais de regarder dans l'index des scripts, comment la nouvelle commande de fenêtre fonctionne bien dans différents modes, il existe des exemples pour la plupart des variantes (modal, rapport, ...)
- D'accord, il y a des exemples. Pas toujours aussi utiles que je le souhaiterais. Presque à chaque fois que j'utilise NewWindow(), je veux faire quelque chose pour lequel il n'existe pas d'exemple similaire. J'ai trouvé des exemples vraiment utiles pour NewWindow() en cherchant dans la communauté.
- Merci d'ajouter également la possibilité d'ajouter des exemples. Il existe des exemples très utiles dans la communauté. Je pense que cela n'a pas de sens de surcharger l'index de scripts avec tous les exemples. Mais cela nous aidera beaucoup si nous avons la possibilité d'ajouter des exemples utiles à NOTRE index de scripts.
- Voici le début de la liste de souhaits :
Vidéo 3 : Trucs et astuces de @jthi
Postez des suggestions :
Ré: Enregistrements et fichiers : Scripters Club sur l'accès aux données, la torréfaction JMP et les trucs et astucesMon matériel ci-joint
Ré: Enregistrements et fichiers : Scripters Club sur l'accès aux données, la torréfaction JMP et les trucs et astucesBravo ! C'est incroyable de voir à quel point ces séances continuent d'être des sources de connaissances immédiatement utiles depuis leur création en 2023.
Je me demande s'il existe une opinion sur SQL dans la fonction JSL Open Database() ? Nous utilisons une implémentation de BigQuery de Google pour l'entreposage de données. Dans BigQuery, il est possible de développer et de déboguer des requêtes SQL qui peuvent être copiées-collées directement dans Open Database() comme indiqué ci-dessous. La possibilité de concaténer des mots-clés SQL ou des horodatages dans le SQL semble également très utile.
Names Default to Here(1);
start = "'2025-02-18 00:00:00'";
stop = "'2025-02-18 01:00:00'";
dt = Open Database( "DSN_name", "
SELECT
time,
tagname,
value
FROM
`bq_project.dataset.table`
WHERE
time BETWEEN TIMESTAMP("|| start ||") AND TIMESTAMP("|| stop ||")
AND tagname IN(
'tag_1',
'tag_2'
)"
);
Ré: Enregistrements et fichiers : Scripters Club sur l'accès aux données, la torréfaction JMP et les trucs et astucesUtilisez une nouvelle requête SQL (je sais que c'est assez horrible... mais c'est la méthode préférée) et utilisez un modèle SQL, puis évaluez-le à l'aide d'Eval Insert, ce serait ma suggestion. Exemple ci-dessous :
Names Default to Here(1);
MY_CONNECTOR = "ODBC:...";
start = "'2025-02-18 00:00:00'";
stop = "'2025-02-18 01:00:00'";
sql_template = "\[
SELECT
time,
tagname,
value
FROM
`bq_project.dataset.table`
WHERE
time BETWEEN TIMESTAMP(¤start¤) AND TIMESTAMP(¤stop¤)
AND tagname IN(
'tag_1',
'tag_2'
)
]\";
sql_str = Eval Insert(sql_template, "¤");
// Write("\!N", sql_str);
obj = New SQL Query(
Connection(MY_CONNECTOR),
Custom SQL(sql_str),
Query Name("mytable")
);
dt = obj << Run Foreground();
Write();
Vous pouvez utiliser une idée de modèle similaire pour d'autres méthodes que la nouvelle requête SQL (comme Open Database()).
J'utilise le caractère spécial "¤" dans mon Eval Insert() car le "^" par défaut est couramment trouvé par exemple à partir de Regex et cela entraînera des problèmes lors de l'évaluation.
Edit : Correction de quelques fautes de frappe, amélioration du langage et ajout d'un commentaire sur "¤"
Ré: Enregistrements et fichiers : Scripters Club sur l'accès aux données, la torréfaction JMP et les trucs et astucesMerci @jthi pour cette présentation très utile ! Cela m'a inspiré à réécrire une fenêtre modale créée dynamiquement pour éviter d'utiliser des chaînes et à utiliser votre méthode XPath pour extraire les résultats.
J'ai trouvé une chose où je ne pouvais pas éviter d'analyser les chaînes : je souhaite inclure des commandes XPath dans la fenêtre modale, mais elles doivent être créées dynamiquement.
Je souhaite créer une case à cocher qui contrôle si une zone d'édition de texte est activée ou non, cependant, je ne sais pas combien de paires zone d'édition de texte/case à cocher il y aura :
rc_list = Lineup Box( N Col( 3 ) );
rc_list << append( Text Box( "Current", <<SET font=""></SET>
Is there a way of doing this so I don't need to parse JSL strings? Or is there a better way to do this modal recode?
<BR /><P>Mon code complet est ici :</P><DIV class="lia-spoiler-container"><A class="lia-spoiler-link" href="#" rel="nofollow noopener noreferrer" target="_blank">Voir plus...</A><NOSCRIPT>(Surligner pour lire)</NOSCRIPT><DIV class="lia-spoiler-border"><DIV class="lia-spoiler-content"><PRE><CODE class=" language-jsl">Names Default To Here( 1 );
// Function to do a simple in-place column recode.
// Uses a modal dialog so can be used as part of a larger script or workflow.
modal_recode = Function( {dt, col},
{default local},
Summarize( dt, orig_vals = By( col ) );
rc_list = Lineup Box( N Col( 3 ) );
rc_list << append( Text Box( "Current", <<SET font=""></SET></CODE><NOSCRIPT><CODE class=" language-jsl"><DIV class="lia-spoiler-noscript-container"><DIV class="lia-spoiler-noscript-content">Noms par défaut ici( 1 ); // Fonction permettant de réaliser un recodage simple de colonne sur place. // Utilise une boîte de dialogue modale et peut donc être utilisée dans le cadre d'un script ou d'un flux de travail plus vaste. modal_recode = Function( {dt, col}, {default local}, Summarize( dt, orig_vals = By( col ) ); rc_list = Lineup Box( N Col( 3 ) ); rc_list << append( Text Box( "Current", < <SET font=""></SET></DIV></DIV>Ré: Enregistrements et fichiers : Scripters Club sur l'accès aux données, la torréfaction JMP et les trucs et astucesJe n'utiliserais pas << XPath dans ce cas mais plutôt ce << prev sib. Je suppose que cela fait ce que vous recherchez :
Alors au lieu de
Eval(
Parse(
"\[rc_list << append( check box( "", <<SET function=""></SET>
<P>tu pourrais faire quelque chose comme ça</P>
<CODE class=" language-jsl">rc_list << Append(Check Box("", << Set Function(function({this},
(this << prev sib) << Enabled(this << get);
))));
Code complet
Voir plus...
Names Default To Here(1);
// Function to do a simple in-place column recode.
// Uses a modal dialog so can be used as part of a larger script or workflow.
modal_recode = Function({dt, col},
{default local},
Summarize(dt, orig_vals = By(col));
rc_list = Lineup Box(N Col(3));
rc_list << append(Text Box("Current", <<SET font=""></SET>
</CODE><NOSCRIPT><CODE class=" language-jsl"><DIV class="lia-spoiler-noscript-container"><DIV class="lia-spoiler-noscript-content">Noms par défaut ici(1); // Fonction permettant de réaliser un recodage simple de colonne sur place. // Utilise une boîte de dialogue modale et peut donc être utilisée dans le cadre d'un script ou d'un flux de travail plus vaste. modal_recode = Function({dt, col}, {default local}, Summarize(dt, orig_vals = By(col)); rc_list = Lineup Box(N Col(3)); rc_list << append(Text Box("Current", < <SET font=""></SET></DIV></DIV>
<P>Si vous souhaitez vraiment utiliser XPath pour cela, vous pouvez calculer l'index de manière dynamique. Vous pouvez par exemple obtenir toutes les CheckBoxBoxes, puis utiliser Contains avec <EM>ceci</EM> pour obtenir l'index, puis utiliser cet index</P>
<CODE class=" language-jsl">idx = Contains(rc_list << XPath("//CheckBoxBox"), this); Ré: Enregistrements et fichiers : Scripters Club sur l'accès aux données, la torréfaction JMP et les trucs et astucesMerci @jthi ! L'approche précédente fonctionne pour moi. Je dois changer ma façon naturelle de penser à la manière dont les fenêtres JMP sont construites et dont elles peuvent être manipulées.
Ré: Enregistrements et fichiers : Scripters Club sur l'accès aux données, la torréfaction JMP et les trucs et astucesJ'ai changé ma façon de penser à de nombreuses reprises et je le fais encore de temps en temps. Je pense que j'utilise généralement quatre méthodes différentes (et une ou plusieurs combinaisons de celles-ci) en fonction de la situation :
- XPath
- Si je veux collecter les résultats de plusieurs éléments en appuyant sur un bouton
- Collecter les références à la liste/au tableau associatif
- Parfois, il est tout simplement facile de collecter la référence à un objet
- << Définir la fonction (fonction (this()))
- Habituellement, pour contrôler certaines actions, comme dans votre cas, l'activation (0/1). Je ne mets généralement pas à jour les valeurs des variables avec cela
- Évaluation de référence
- Pas d'exemples spécifiques, peut-être lorsque pour une raison quelconque, la construction du « chemin » avec XPath ou l'utilisation de celui-ci devient ennuyeuse et que j'ai toujours besoin de la référence (parfois dans des classes ou des fonctions qui renvoient une nouvelle fenêtre)
Exemple d'évaluation de référence
rc_list << append(teb = Text Edit Box(Char(orig_vals[i]), <<ENABLED></ENABLED>
<BR />
<BR />Ré: Enregistrements et fichiers : Scripters Club sur l'accès aux données, la torréfaction JMP et les trucs et astucesJe ne peux pas donner autant de félicitations pour une seule réponse. Merci, @jthi , vraiment.