jmpクエリとスクリプトの統合を支援します。最近、製造データをjmpテーブルに直接インポートして分析するためにjmpを使い始めました。
通常、私の要件は、製造プロセスの各プロセスステップのデータを抽出し、処理されたすべてのバッチについてデータを抽出し、それらからチャートを作成することです。
そこで、プロセスごとにjmpqueireを作成することから始めました。多くの場合、クエリへの入力として、プロセスコードと抽出元の日付を指定したいと思います。
したがって、すべてのjmpqueriesには次のフィルターがあり、クエリを実行するたびに日付を変更できるように、日付をプロンプト変数として保持しています。

チャートをプロットしたいので、ほとんどの場合、データはフォーマットと形状で保存されないため、後処理スクリプトもあります。 これにより、元のクエリの抽出で出力されるテーブルから新しいテーブルを作成する必要があります。
したがって、私のすべてのjmpqueriesは、2つのテーブルを生成することになります。例を以下に示します。

これはかなりうまく機能していました。これまで、さまざまなjmpクエリによって生成されたさまざまなテーブルを結合して、これらのクエリの統合を開始したいと思います。
そこで、次のスクリプトを書き始めます。
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(.
.
.
.
さて、これが私が助けてもらいたいことです。期待した反応が得られていないからです。
- まず、すべてのクエリに日付プロンプトがあるので、待って日付を指定し、その間に数回[OK]をクリックする必要があります-最初の日付が取得され、後続のすべてのjmpクエリに使用されるようにクエリを変更するにはどうすればよいですか?
- プライベートとして表示したくないテーブルを開いていますが、それでも表示され続けます。 私は何が間違っているのですか?
- すべてのjmpqueiesのSQLクエリがありますが、現在行っているように各jmpqueryファイルを開くのではなく、スクリプトにそれらを配置するにはどうすればよいですか?
スクリプティングRe:jmpクエリとスクリプトの統合を支援します。@pmroz @Georgみんなありがとう!!
クエリを\[で囲むと、2番目の問題のトリックが実行されます。
Re:jmpクエリとスクリプトの統合を支援します。JSLでSQLを開発するのは難しいです-として@Georg言及では、SQLDeveloperやPL/SQLDeveloperなどのツールを使用します。
私は開発しましたlog_execute_sql数年前に機能しました-ファイル交換に投稿されました: OracleODBCSQLのエラートラップ
これは、JSLでSQLをデバッグするための非常に貴重な助けになりました。
Re:jmpクエリとスクリプトの統合を支援します。@pmroz一般的な見積もり\[\]を使用した提案に感謝します。これは、私が考えもしなかったもう1つの方法です。
そのように機能しない限り、私は個人的に名前のハイフンやSQLの二重引用符は好きではありません。なぜなら、過去にそれが原因で多くの苦痛を味わったからです。
Re:jmpクエリとスクリプトの統合を支援します。エラーは、一重引用符を使用して列ヘッダーを設定しようとしているためです。Oracleでは、列名を二重引用符で囲む必要があります。これは機能するはずです。\[と]\を使用して、厄介なエスケープ文字なしで文字列に二重引用符を含めることができることに注意してください。
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;]\";
問題が解決しない場合は、ASコマンドを使用せず、代わりにJSLの列名を変更してください。する必要はありません-私はいつもこの構文を問題なく使用しています。
Re:jmpクエリとスクリプトの統合を支援します。@spoikayil 、あなたは正しい道を進んでいます、接続は大丈夫のようです。
エラーはSQLエラーです。ODBCドライバーは、SQLの「from」ステートメントの前にエラーがあることを通知します。 したがって、引用されている場合でも、名前「M32-FICD-DATE」の列の「-」に問題があると思います。 selectステートメントでコロン(、)が欠落している場合も、同じエラーが発生します。 名前に「-」を使用したり、二重引用符を使用したりしないでください(すでに述べたように)。
JMP(スクリプトエラー)でSQLクエリを記述/開発することは、このように構文エラーを簡単に発生させるため、非常に困難です。 また、スクリプト内のSQLにはさらに多くの問題があり、それらの中には見えないものもあります(非表示の文字もあります…)。 その間、私は経験豊富なSQLライターですが、SQLの作成には常にSQL開発者のような別のツールを使用しています。 JMPでは、少なくとも複雑なクエリについては、私の意見ではプレーンSQLを作成することはできません。 ただし、もちろん、単純なクエリにはグラフィカルクエリビルダーを使用できます。
「RunForeground()」を「Modify()」に置き換えると、クエリエディタが開き、クエリを読みやすく、テストすることもできます。
Re:jmpクエリとスクリプトの統合を支援します。@pmroz 、 @Georgフィードバックありがとうございます!
設定がpmrozによって提案されたとおりであることを確認してから、Georgが推奨した方法1を試しました。接続文字列とSQLクエリを個別の変数に割り当て、New SQL Query()メソッドを使用してクエリを実行します。
以前に取得したODBCドライバーエラーが発生しなくなったため、機能しているようです。
ただし、次のような新しいエラーが発生します。それが悪いクエリによるものかどうかはわかりません。
jmpqueryファイルの[SQL]タブからクエリをコピーしました。 列エイリアスの二重引用符を変更しました「M32-FICD-DATE」 REVDATE列を一重引用符にすると、文字列の終わりとして間違った二重引用符が検出されます。
[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:jmpクエリとスクリプトの統合を支援します。何に追加するには@Georgつまり、私のOracle接続文字列は次のようになります。
dsn_string = "Driver={Oracle in OraClient12Home1};Dbq=tns_alias_goes_here;UID=username_goes_here;PWD=password_goes_here;";
「OracleinOraClient12Home1」という部分は、OracleODBCドライバーの名前であることに注意してください。
Re:jmpクエリとスクリプトの統合を支援します。@spoikayil 、データベースからデータをクエリする方法はいくつかあり、何らかの方法で異なる接続が必要になることに注意してください。
.jmpqueryの場合、接続文字列は「ODBC:…」で始まる必要があり、その他の場合は削除する必要があります。jslの例を参照してください。 そうしないと、投稿したエラーが正確に表示されます。 過去にそれを理解するのに少し時間がかかりました。
この例では、異なるメソッドを使用して3つのテーブルを生成します。
// 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:jmpクエリとスクリプトの統合を支援します。MicrosoftOracleODBCドライバーで問題が発生しました。ただし、Oracleのものは正常に機能します。
少し面倒ですが、接続文字列を取得する方法は次のとおりです。
- JMPで、をクリックします設定>テーブル。確実にODBC非表示接続文字列チェックされていません。
- クリックファイル>データベース>テーブルを開く
- クリック新しい接続
- [マシンデータソース]の下にOracleODBCドライバーが表示されない場合は、[新しい
- 適切なOracleドライバを選択します。私のマシンでは「 OraClient12Home1のOracle 「」
- クリック終了
- OracleODBCドライバーの構成画面が表示されます
- 適切なTNSサービス名とユーザーIDを選択します。
- [接続のテスト]をクリックして、接続を試してください
- [OK]、[OK]をクリックします
- Database Open Table画面に、スキーマのリストが表示されます
- スキーマをクリックすると、テーブルが表示されます。
- テーブルをクリックしてから、をクリックしますテーブルを開く
- テーブルには、というプログラムがありますソース。緑の三角形を右クリックして、編集-正しい接続文字列が表示されます。
退屈だと言ったように、接続文字列を取得したら、準備は完了です。環境設定の[ODBC非表示]チェックボックスをオンにすることを忘れないでください。
Re:jmpクエリとスクリプトの統合を支援します。PS:32ビットのJMP14.1.0を使用していますが、Oracleドライバーも32ビットです。Re:jmpクエリとスクリプトの統合を支援します。ありがとうございました@pmrozあなたのフィードバックのために、私はこれを試しました。 jmpqueryで接続文字列をコピーしましたが、スクリプトが実行されず、ログに次のエラーが表示されます。
[Microsoft] [ODBCドライバーマネージャー]データソース名が見つからず、デフォルトのドライバーが指定されていません\
ただし、jmpqueriesを実行すると、同じ接続が正常に機能します。 ここで何が起こっているのでしょうか?
私の接続文字列:
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:jmpクエリとスクリプトの統合を支援します。SQLクエリがある場合は、SQL実行の使用に切り替えることができます。同じ日付範囲を使用して2つのクエリを実行する方法は次のとおりです。TO_DATE関数は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>