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

ほとんどの場合、データはグラフをプロットしたい形式や形状で保存されないため、後処理スクリプトもいくつか用意しています。 これにより、元のクエリの抽出で得られたテーブルから新しいテーブルを作成する必要があります。
したがって、すべての jmpquery は最終的に 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 クエリに使用されるようにクエリを変更するにはどうすればよいでしょうか?
- 非公開として表示したくないテーブルを開いているにもかかわらず、表示され続けます。 私の何が間違っているのでしょうか?
- すべての jmpquey の SQL クエリがあるのですが、現在のように各 jmpquery ファイルを開くのではなく、それらをスクリプトに含めるにはどうすればよいですか?
データアクセスRe: jmp クエリとスクリプトの統合を支援します。@pmroz @ゲオルグみんなありがとう!!
クエリを \[ で囲むと、2 番目の問題がうまくいきます。
Re: jmp クエリとスクリプトの統合を支援します。JSL で SQL を開発するのは難しいです。 @ゲオルグSQL Developer や PL/SQL Developer などのツールの使用について言及しています。
私が開発したのは、 log_execute_sql数年前の関数 - ファイル交換に投稿されました。 Oracle ODBC SQL のエラー トラップ
これは、JSL で SQL をデバッグするのに非常に貴重な助けになります。
Re: jmp クエリとスクリプトの統合を支援します。@pmroz一般的な引用 \[ \] を使用した提案をありがとうございます。これは私が思いつきもしなかった別の方法です。
そのように機能する可能性がある場合を除いて、私は個人的に 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 を書くことは不可能です。 ただし、もちろん、単純なクエリにはグラフィカル クエリ ビルダーを使用できます。
"Run Foreground()" を "Modify()" に置き換えると、クエリ エディターが開き、クエリを読みやすくテストできるようになり、見た目が少し良くなります。
Re: jmp クエリとスクリプトの統合を支援します。@pmroz 、 @ゲオルグフィードバックをお寄せいただきありがとうございます。
pmroz が提案したとおりの設定であることを確認し、Georg が推奨した方法 1 を試しました。接続文字列と SQL クエリを別々の変数に割り当て、New SQL Query() メソッドでクエリを実行します。
以前は発生していたODBCドライバーエラーが発生しなくなったため、機能しているようです。
ただし、次のような新しいエラーが発生します。それが不正なクエリによるものかどうかはわかりません。
jmpquery ファイルの SQL タブからクエリをコピーしました。 列エイリアスの二重引用符を変更しました「M32-FICD-日付」 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 クエリとスクリプトの統合を支援します。何に追加するか@ゲオルグ私の Oracle 接続文字列は次のようになります。
dsn_string = "Driver={Oracle in OraClient12Home1};Dbq=tns_alias_goes_here;UID=username_goes_here;PWD=password_goes_here;";
「OraClient12Home1 の Oracle」と書かれている部分が Oracle ODBC ドライバーの名前であることに注意してください。
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 クエリとスクリプトの統合を支援します。Microsoft Oracle ODBC ドライバーで問題が発生しました。ただし、Oracle のものは正常に動作します。
少し面倒ですが、接続文字列を取得する方法は次のとおりです。
- JMP で、 をクリックします。環境設定 > テーブル。確認するODBC 接続文字列の非表示チェックが外されています。
- クリックファイル > データベース > テーブルを開く
- クリック新しい接続
- [マシン データ ソース] の下に Oracle ODBC ドライバーが表示されない場合は、[マシン データ ソース] をクリックします。新しい
- 適切な Oracle ドライバーを選択します。私のマシンでは「 OraClient 12Home1 の Oracle 」
- クリック仕上げる
- 「Oracle ODBC Driver Configuration」画面が表示されます。
- 適切な TNS サービス名とユーザー ID を選択します。
- 「接続のテスト」をクリックして接続を試します
- 「OK」、「OK」をクリックします
- 「データベースを開くテーブル」画面にスキーマのリストが表示されます。
- スキーマをクリックするとテーブルが表示されます。
- テーブルをクリックしてから、オープンテーブル
- テーブルには、というプログラムが含まれます。ソース。緑色の三角形を右クリックして選択します編集- 正しい接続文字列が表示されます。
先ほども言いましたが、面倒ですが、接続文字列を取得したら準備は完了です。環境設定で「ODBC Hide」チェックボックスをオンにすることを忘れないでください。
Re: jmp クエリとスクリプトの統合を支援します。PS: 私は 32 ビット JMP14.1.0 を使用していますが、Oracle ドライバーも 32 ビットですRe: jmp クエリとスクリプトの統合を支援します。ありがとう@pmrozフィードバックのために、これを試してみました。 jmpquery に接続文字列をコピーしましたが、スクリプトは実行されず、ログに次のエラーが表示されます。
[Microsoft][ODBC Driver Manager] データ ソース名が見つからず、デフォルトのドライバーが指定されていません\
ただし、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>