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 les données d'une pièce testée à partir 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ù je vais mal?
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 exécuté 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 / Update From DB dans la table de données vide.
Tableau de donnéesScriptles fenêtresRe : Qu'est-ce qui ne va pas dans mon appel de fonction ?Vérifier la fonction à partir de l'index de script et à partir 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 voulez 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 la partDataTable que vous souhaitez utiliser directement dans Open Database :
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
);
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 ?Si vous l'avez entre guillemets, il nommera probablement votre table de données en 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 ?@jthi . Hmm, mais je reçois 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 ?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. Le simple fait d'économiser ne semble pas suffire. Est-ce correct?
J'avais appliqué les citations à partDataTable et enregistré ma fonction. L'appel de fonction a fonctionné comme prévu avec le nom de table de données que je désire. 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 ?Oui (si j'ai bien compris 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 c'était aussi peu clair qu'il y paraît, demandez à nouveau...
Écrivez vos propres fonctions peut être intéressant aussi.
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 le PartID, vous pouvez simplement utiliser un 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 la table de données de la fonction (car c'est la "dernière" ligne), mais je ne me sens pas à l'aise de lui faire confiance, donc j'utiliserais la 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);
);