Aide à la consolidation des requêtes et des scripts jmp.J'ai commencé à utiliser jmp récemment pour importer des données de fabrication directement dans des tables jmp et les analyser.
En règle générale, mon exigence est d'extraire les données pour chaque étape du processus de fabrication, pour tous les lots traités et d'en faire des graphiques.
J'ai donc commencé par créer des jmpqueires pour chacun des processus - et souvent je veux donner le code du processus ainsi que la date à partir de laquelle je veux l'extraction comme entrées de la requête.
Toutes mes jmpqueries ont donc les filtres suivants, et j'ai gardé la date comme variable d'invite afin de pouvoir la changer à chaque fois que j'exécute la requête

J'ai aussi un script de post-traitement car presque toujours les données ne sont pas stockées dans le format et la forme que je veux pour tracer des graphiques. Cela m'oblige à créer une nouvelle table à partir de la table qui sort avec l'extraction de la requête d'origine.
Ainsi, toutes mes requêtes jmp finissent par générer deux tables, un exemple est présenté ci-dessous ;

Cela fonctionnait plutôt bien, jusqu'à présent, je veux commencer à consolider ces requêtes en joignant différentes tables générées par mes nombreuses requêtes jmp différentes.
Alors je commence à écrire le script ci-dessous qui va:
finCDquery = open( "PATH\New M33 final CD.jmpquery", Private );
devCDquery = open( "PATH\New M33 develop CD.jmpquery", Private );
M33finCD = finCDquery << Run Foreground(Private);
M33devCD = devCDquery << Run Foreground(Private);
Data Table( "M33-CD QUERY" ) << Join(
With( Data Table( "M33D-CD QUERY" ) ),
Select(.
.
.
.
Maintenant, voici les choses pour lesquelles j'aimerais avoir de l'aide; car je n'obtiens pas tout à fait la réponse attendue.
- Tout d'abord, chaque requête a l'invite de date, je dois donc attendre et donner la date et cliquer sur ok plusieurs fois entre les deux - comment puis-je modifier les requêtes de sorte que la première date que je donne soit prise et utilisée pour toutes les requêtes jmp suivantes ?
- Bien que j'ouvre les tables, je ne veux pas être visible en tant que privé, elles continuent néanmoins à apparaître. Qu'est-ce que je fais mal?
- J'ai les requêtes SQL pour tous mes jmpqueies, comment puis-je les mettre dans le script plutôt que d'ouvrir chacun de mes fichiers jmpquery comme je le fais maintenant ?
Accès aux donnéesRe : Aide à la consolidation des requêtes et des scripts jmp.@pmroz @Georg Merci les gars!!
Enfermer la requête dans \[ fait l'affaire pour le deuxième problème.
Re : Aide à la consolidation des requêtes et des scripts jmp.Il est difficile de développer SQL en JSL - car @Georg les mentions utilisent un outil comme SQL Developer ou PL/SQL Developer.
j'ai développé le log_execute_sql fonction il y a quelques années - c'est posté dans l'échange de fichiers : Interception d'erreurs pour Oracle ODBC SQL
C'est devenu une aide inestimable pour déboguer SQL dans JSL.
Re : Aide à la consolidation des requêtes et des scripts jmp.@pmroz merci pour votre suggestion en utilisant la citation générale \[ \], c'est une autre façon à laquelle je n'ai même pas pensé.
À moins que cela ne fonctionne de cette façon, personnellement, je n'aime pas les traits d'union dans les noms et les guillemets doubles dans SQL…, parce que j'ai eu beaucoup de mal à cause de cela… dans le passé.
Re : Aide à la consolidation des requêtes et des scripts jmp.L'erreur est due au fait que vous essayez de définir l'en-tête de colonne à l'aide de guillemets simples.Oracle souhaite que le nom de la colonne soit entouré de guillemets doubles.Cela devrait fonctionner - notez que j'utilise \[ et ]\ pour permettre aux guillemets doubles d'être dans la chaîne sans ces caractères d'échappement embêtants.
M32FICDSQL =
"\[SELECT t1.LOTID, t2.COMPIDS AS WAFERID, t1.EQPID, t2.REVDATE AS "M32-FICD-DATE",
t1.PARTID, t1.RECPID, t2.ITEMPROMPT, t2.NUMERICVALUE,
t3.LOTTYPE
FROM PLLDBA.TRES t1
LEFT OUTER JOIN PLLDBA.ACTL t3
ON ( t1.LOTID = t3.LOTID )
INNER JOIN PLLDBA.TRES_RAWDATA t2
ON ( ( t1.TESTOPNO = t2.TESTOPNO ) AND ( t1.REVDATE = t2.REVDATE ) )
WHERE ( ( ( (t1.TESTOPNO LIKE '%JG43%' ) ) AND ( t2.REVDATE >= TO_TIMESTAMP('01Jan2019:18:42:42', 'DDMONYYYY:HH24:MI:SS') ) AND ( t2.ITEMPROMPT IN ( 'ITEM1' , 'MITEM2' , 'ITEM3' , 'ITEM4' ) ) AND ( (t1.RECPID LIKE '%HJ546%' ) ) AND ( (t3.LOTTYPE LIKE '%PT%' ) ) AND ( (t1.PARTID LIKE '%C765G%' ) ) ) )
ORDER BY t2.COMPIDS DESC, t2.REVDATE ASC;]\";
Si vous continuez à avoir des problèmes, n'utilisez pas la commande AS et modifiez plutôt le nom de la colonne dans JSL.Vous ne devriez pas avoir à le faire - j'utilise cette syntaxe tout le temps sans aucun problème.
Re : Aide à la consolidation des requêtes et des scripts jmp.@spoikayil , vous êtes sur la bonne voie, la connexion semble correcte.
Votre erreur est une erreur SQL, le pilote ODBC vous indique qu'il y a une erreur avant votre instruction "from" dans le SQL. Je pense donc qu'il y a un problème avec "-" dans votre nom de colonne "M32-FICD-DATE", même lorsqu'il est cité. Vous obtenez la même erreur lorsqu'il manque un deux-points (,) dans l'instruction select. N'utilisez jamais "-" dans les noms et n'utilisez jamais de guillemets doubles (comme vous l'avez déjà mentionné).
Écrire/développer des requêtes SQL dans JMP (erreur de script) est très difficile, car vous faites facilement des erreurs de syntaxe comme ici. Et il y a beaucoup plus de problèmes avec SQL dans les scripts, certains d'entre eux que vous ne pouvez même pas voir (certains caractères cachés…). Bien que je sois un rédacteur SQL expérimenté, j'utilise toujours un outil différent comme SQL Developer .. pour écrire SQL. Avec JMP, il n'est pas possible d'écrire du SQL brut à mon avis, du moins pour les requêtes complexes. Mais bien sûr, vous pouvez utiliser le générateur de requêtes graphique pour des requêtes simples.
Légèrement mieux, lorsque vous remplacez "Run Foreground ()" par "Modify ()", l'éditeur de requête s'ouvre et vous pouvez mieux lire votre requête et la tester.
Re : Aide à la consolidation des requêtes et des scripts jmp.@pmroz , @Georg Merci beaucoup pour vos commentaires!
J'ai vérifié que les préférences étaient telles que suggérées par pmroz, puis j'ai essayé la méthode 1, que Georg avait recommandée - assigner la chaîne de connexion et la requête SQL pour séparer les variables et exécuter la requête avec la méthode New SQL Query().
Cela semble fonctionner - car je n'obtiens plus l'erreur de pilote ODBC que j'avais l'habitude d'obtenir auparavant.
Cependant, j'obtiens une nouvelle erreur comme ci-dessous; et je ne sais pas si cela est dû à une mauvaise requête ou non.
J'ai copié la requête à partir de l'onglet SQL du fichier jmpquery. J'ai changé les guillemets doubles pour l'alias de colonne 'M32-FICD-DATE' pour la colonne REVDATE aux guillemets simples, sinon il intercepte le mauvais guillemet double comme fin de la chaîne.
[Oracle][ODBC][Ora]ORA-00923: FROM keyword not found where expected [SQLSTATE=HY000] in access or evaluation of 'Run Foreground' , Run Foreground() /*###*/
In the following script, error marked by /*###*/
Names Default To Here( 1 );
cnxstrng =
"ODBC:DSN=****;UID=*******;PWD=******;DBQ=*****;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD=0;ODA=F;STE=F;TSZ=8192;AST=FLOAT;";
M32FICDSQL =
"SELECT t1.LOTID, t2.COMPIDS AS WAFERID, t1.EQPID, t2.REVDATE AS 'M32-FICD-DATE',
t1.PARTID, t1.RECPID, t2.ITEMPROMPT, t2.NUMERICVALUE,
t3.LOTTYPE
FROM PLLDBA.TRES t1
LEFT OUTER JOIN PLLDBA.ACTL t3
ON ( t1.LOTID = t3.LOTID )
INNER JOIN PLLDBA.TRES_RAWDATA t2
ON ( ( t1.TESTOPNO = t2.TESTOPNO ) AND ( t1.REVDATE = t2.REVDATE ) )
WHERE ( ( ( (t1.TESTOPNO LIKE '%JG43%' ) ) AND ( t2.REVDATE >= TO_TIMESTAMP('01Jan2019:18:42:42', 'DDMONYYYY:HH24:MI:SS') ) AND ( t2.ITEMPROMPT IN ( 'ITEM1' , 'MITEM2' , 'ITEM3' , 'ITEM4' ) ) AND ( (t1.RECPID LIKE '%HJ546%' ) ) AND ( (t3.LOTTYPE LIKE '%PT%' ) ) AND ( (t1.PARTID LIKE '%C765G%' ) ) ) )
ORDER BY t2.COMPIDS DESC, t2.REVDATE ASC;";
dt1 = New SQL Query(
connection( cnxstrng ),
queryname( "M32FICD" ),
customSQL( M32FICDSQL )
) << Run Foreground() /*###*/;Re : Aide à la consolidation des requêtes et des scripts jmp.Pour ajouter à quoi @Georg dit, ma chaîne de connexion Oracle ressemble à ceci :
dsn_string = "Driver={Oracle in OraClient12Home1};Dbq=tns_alias_goes_here;UID=username_goes_here;PWD=password_goes_here;";
Notez que la partie qui dit "Oracle dans OraClient12Home1" est le nom du pilote Oracle ODBC.
Re : Aide à la consolidation des requêtes et des scripts jmp.@spoikayil , Veuillez noter qu'il existe plusieurs méthodes pour interroger les données des bases de données, nécessitant en quelque sorte des connexions différentes.
Pour la requête .jmp, la chaîne de connexion doit commencer par "ODBC : …", et pour les autres, vous devez la supprimer, voir l'exemple jsl. Sinon, vous obtenez exactement l'erreur que vous avez publiée. Il m'a fallu du temps pour le comprendre dans le passé.
L'exemple génère 3 tables en utilisant différentes méthodes.
// Three methods to get data from database via ODBC
Names Default To Here( 1 );
// provide your credentials here (DSN, USER, PWD, DBQ)
cnx_str1 = "ODBC:DSN=__MY_DSN__;UID=__USER__;PWD=__PWD__;DBQ=__MY_DBQ__;";
cnx_str2 = "DSN=__MY_DSN__;UID=__USER__;PWD=__PWD__;DBQ=__MY_DBQ__;";
sql_str = "select * from dual";
//**** 1st method
dt1 = New SQL Query( connection( cnx_str1 ), queryname( "dt_jmpquery" ), customSQL( sql_str ) ) << Run Foreground();
//**** 2nd method
// This fails due to cnx starting with "ODBC:"
// dt2 = open database(cnx_str1, "select * from dual");
// This is ok
dt2 = Open Database( cnx_str2, sql_str, "dt_open_database" );
//**** 3rd method
cnx = Create Database Connection( cnx_str2 );
dt2 = Execute SQL( cnx, sql_str, "dt_execute_SQL" );
Close Database Connection( cnx );
Re : Aide à la consolidation des requêtes et des scripts jmp.J'ai eu des problèmes avec le pilote Microsoft Oracle ODBC.Celui d'Oracle fonctionne bien cependant.
C'est un peu fastidieux, mais voici comment j'ai obtenu la chaîne de connexion :
- Dans JMP, cliquez sur Préférences > Tableaux .S'assurer ODBC Masquer la chaîne de connexion n'est pas cochée.
- Cliquer sur Fichier > Base de données > Ouvrir la table
- Cliquer sur Nouvelle connexion
- Si vous ne voyez pas de pilote Oracle ODBC répertorié sous Machine Data Source, cliquez sur Nouveau
- Sélectionnez le pilote Oracle approprié.Sur ma machine c'est " Oracle dans OraClient 12Home1 "
- Cliquez sur Finition
- Vous arriverez à un écran de configuration du pilote Oracle ODBC
- Sélectionnez le nom de service TNS et l'ID utilisateur appropriés.
- Cliquez sur Tester la connexion pour tester la connexion
- Cliquez sur OK, OK
- L'écran Database Open Table affichera une liste de schémas
- Cliquez sur un schéma et des tableaux apparaîtront.
- Cliquez sur un tableau puis cliquez sur Table ouverte
- La table aura un programme appelé Source .Faites un clic droit sur le triangle vert et sélectionnez Modifier - qui vous montrera la chaîne de connexion correcte.
Comme je l'ai dit fastidieux, mais une fois que vous avez la chaîne de connexion, vous êtes prêt à partir.N'oubliez pas de cocher la case Masquer ODBC dans les préférences.
Re : Aide à la consolidation des requêtes et des scripts jmp.PS: j'utilise JMP14.1.0 32 bits et mon pilote Oracle est également 32 bitsRe : Aide à la consolidation des requêtes et des scripts jmp.Merci @pmroz pour vos retours, j'ai essayé. J'ai copié la chaîne de connexion dans mon jmpquery, mais le script ne s'exécute pas et le journal donne l'erreur suivante :
[Microsoft][ODBC Driver Manager] Nom de la source de données introuvable et aucun pilote par défaut spécifié\
Cependant, la même connexion fonctionne correctement lorsque j'exécute les jmpqueries. Qu'est-ce qui ne va pas ici ?
Ma chaîne de connexion :
MYDB = create database connection("ODBC:DSN=*****;UID=*****;PWD=*****;DBQ=*****;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD=0;ODA=F;STE=F;TSZ=8192;AST=FLOAT;");Re : Aide à la consolidation des requêtes et des scripts jmp.Si vous avez les requêtes SQL, vous pouvez passer à l'utilisation de l'exécution SQL.Voici comment exécuter deux requêtes en utilisant la même plage de dates.Notez que la fonction TO_DATE est la syntaxe Oracle.
dbc = create database connection("<CONNECTION string="">");
start_date = "01-Jan-2020";
end_date = "30-Apr-2020";
sql1 = evalinsert(
"SELECT m.foo, m.bar
FROM myschema.mytable m
WHERE m.some_date BETWEEN TO_DATE('^start_date^', 'DD-MON-YYYY')
AND TO_DATE('^end_date^', 'DD-MON-YYYY')");
dt1 = execute sql(dbc, sql1);
sql2 = evalinsert(
"SELECT a.field1, a.field2
FROM myschema.another_table a
WHERE a.some_date BETWEEN TO_DATE('^start_date^', 'DD-MON-YYYY')
AND TO_DATE('^end_date^', 'DD-MON-YYYY')");
dt2 = execute sql(dbc, sql2);
close database connection(dbc);
</CONNECTION>