Qu'est-ce qui ne va pas dans mon appel de fonction ?J'apprends à écrire et appeler une fonction dans JMP (venant de Matlab).
Essayer d'extraire des données pour une pièce testée de la base de données via une requête SQL.
A écrit deux scripts distincts. L'une est une fonction avec PartID comme variable d'entrée et la table de données de test comme sortie.
Un autre script est l'appel de fonction, mais je ne semble pas pouvoir transmettre le partID à la fonction. Où est-ce que je me trompe ?
Mon appel de fonction
partDataTable = getDataTable4partID("PART16.0009")Ma fonction
getDataTable4PartID = Function( {PartID},{partDataTable},
Open Database(
"Driver=SQL Server;
Server=XAB-SQL02;
DATABASE=TBSDF;
Trusted_Connection=Yes;",
"SELECT * FROM dbo.View_BBX a WHERE a.Part like 'PartID' AND a.TestDateTime > '2021-02-01'",
"partDataTable" // name of the output data table
);
);La requête SQL elle-même fonctionne lorsque PartID est remplacé par le numéro de pièce réel PART16.0009 et s'exécute séparément en crachant la table de données souhaitée, mais lorsque j'utilise l'appel de fonction, la table de données a toujours « PartID » dans les scripts Source/Mise à jour à partir de la base de données. dans la table de données vide.
Accès aux donnéesles fenêtresRe : Qu'est-ce qui ne va pas dans mon appel de fonction ?Ajouter
include ("getDataTable4partID.jsl");avant que l'appel de fonction ne semble avoir résolu tous les problèmes que j'ai rencontrés.
Re : Qu'est-ce qui ne va pas dans mon appel de fonction ?Merci @jthi . Tous mes scripts et fonctions ont la première ligne comme
Names Default To Here(1);
Il se trouve (comme mentionné dans mon article précédent) que cette fonction particulière ne s'est pas exécutée sans commenter la ligne ci-dessus.
Dans tous les cas, si j'utilise la fonction suggérée, je obtenez une table de données avec les données attendues/correctes mais la table de données s'appelle UntitledXX (XX se trouve être 24 dans mon cas). Toute aide pour résoudre ce problème serait très utile. Merci.
Re : Qu'est-ce qui ne va pas dans mon appel de fonction ?Si les noms par défaut sont ici (1); casse votre script, il y a probablement un problème avec les espaces de noms. Vous devriez presque toujours démarrer les scripts JSL avec Names Default To Here(1) et cela ne devrait rien casser.
Je suppose qu'il est défini au mauvais endroit (ou appelé au mauvais endroit), l'ordre d'exécution compte avec JSL.
Re : Qu'est-ce qui ne va pas dans mon appel de fonction ?Merci @jthi .J'ai deux problèmes avec ce que vous avez suggéré.
Si j'appelle la fonction
//Names Default To Here(1);
getDataTable4PartID = Function({PartID}, {dtTemp},
dtTemp = Open Database("connectionstring",
"select '" || PartID || "' as value
from dual",
PartID
);
return(dtTemp);
);comme
</CODE></PRE><P>J'obtiens une table de données avec les données attendues/correctes mais la table de données s'appelle UntitledXX (XX se trouve être 24 dans mon cas).</P><P>Notez également que j'ai dû commenter</P><PRE class="language-jsl"><CODE>Names Default To Here(1);DataTable4PartID = getDataTable4PartID("PART16.0009");
sans lequel l'appel de fonction ne fonctionnait pas. Je ne sais pas ce qui se passe... toute aide serait très utile.
Re : Qu'est-ce qui ne va pas dans mon appel de fonction ?Oui, vous devrez exécuter la fonction une fois pour la "mettre à jour".
Si vous souhaitez que la table de données porte le même nom que PartID, vous pouvez simplement utiliser un seul argument dans la fonction. Voici un exemple un peu plus complet avec et sans guillemets :
Names Default To Here(1);
getDataTable4PartID_withQuotes = Function({PartID},
Open Database("connectionstring",
"
select '" || PartID || "' as value
from dual
",
"PartID"
);
);
partDataTable_withQuotes = getDataTable4PartID_withQuotes("PART16.0009");
Show(partDataTable_withQuotes);
getDataTable4PartID = Function({PartID},
Open Database("connectionstring",
"
select '" || PartID || "' as value
from dual
",
PartID
);
);
partDataTable = getDataTable4PartID("PART16.0009");
Show(partDataTable);Pour moi, ceux-ci sont imprimés dans le journal :
partDataTable_withQuotes = DataTable("PartID");
partDataTable = DataTable("PART16.0009");
JMP renverra le datatable de la fonction (car il s'agit de la "dernière") ligne, mais je ne me sens pas à l'aise de lui faire confiance, donc j'utiliserais une référence locale dans la fonction, puis je renverrais la référence et la fonction finale serait quelque chose comme :
getDataTable4PartID = Function({PartID}, {dtTemp},
dtTemp = Open Database("connectionstring",
"select '" || PartID || "' as value
from dual",
PartID
);
return(dtTemp);
);
Re : Qu'est-ce qui ne va pas dans mon appel de fonction ?Oui (si je comprends la question), la fonction "function(...)" doit être exécutée pour remplacer la fonction compilée dans la variable à laquelle elle est affectée, getDataTable4PartID dans votre exemple.
Si cela n'est pas aussi clair qu'il y paraît, demandez à nouveau...
Écrivez vos propres fonctions ça pourrait être intéressant aussi.
Re : Qu'est-ce qui ne va pas dans mon appel de fonction ?Je viens de réaliser quelque chose et je dois confirmer si c'est bien le cas. Après avoir modifié la fonction, il semble que je doive exécuter la fonction une fois pour que les modifications soient appliquées. Épargner ne semble pas suffire. Est-ce correct?
J'avais appliqué les citations à partDataTable et j'ai enregistré ma fonction. L'appel de fonction a fonctionné comme prévu avec le nom de table de données que je souhaite. Mais après avoir exécuté la fonction une fois, lorsque j'exécute à nouveau l'appel de fonction, j'obtiens ce que vous avez dit que j'obtiendrais, c'est-à-dire partDataTable comme nom du fichier de table de données généré.
Re : Qu'est-ce qui ne va pas dans mon appel de fonction ?@jthi . Hmm, mais j'obtiens le nom que je veux que la table de données de sortie soit appelée (c'est-à-dire le même que mon partID).Ceci est mon appel de fonction.
partDataTable = getDataTable4partID("PART16.0009","PART16.0009")
Re : Qu'est-ce qui ne va pas dans mon appel de fonction ?Si vous l'avez entre guillemets, il nommera probablement votre table de données partDataTable et non avec le nom que vous vouliez (si vous vouliez l'avoir comme argument).
Re : Qu'est-ce qui ne va pas dans mon appel de fonction ?Merci. Cela marche. Cependant, j'ai noté qu'avoir partDataTable avec des guillemets fonctionne également très bien. Est-ce que c'est censé être comme ça ?
Re : Qu'est-ce qui ne va pas dans mon appel de fonction ?Vérifiez la fonction à partir de l'index de script et de Fonctions de programmation - Fonction . Vérifiez également Guide de script
Actuellement, vous avez PartID comme seul argument et partDataTable comme variable locale pour getDataTable4PartID que vous n'utilisez pas. Très probablement, vous souhaitez que la fonction soit définie avec quelque chose comme ceci pour avoir des arguments :
getDataTable4PartID = Function( {PartID, partDataTable},
Après avoir réglé cela, vous devez comprendre comment utiliser les arguments dans l’expression à l’intérieur de la fonction. Pour PartID, vous souhaitez le concaténer dans la requête SQL et partDataTable que vous souhaitez utiliser directement dans la base de données ouverte :
Open Database(
"Driver=SQL Server;
Server=XAB-SQL02;
DATABASE=TBSDF;
Trusted_Connection=Yes;",
"SELECT * FROM dbo.View_BBX a WHERE a.Part like '"||PartID||"' AND a.TestDateTime > '2021-02-01'",
partDataTable // no need for quotes here
);