バックグラウンドでクエリを実行し、完了するのを待って、残りの JSL スクリプトで参照します。問題
ユーザー インターフェイスがフリーズしないようにバックグラウンドでクエリを実行したい場合や、複数のクエリを同時に実行して結果を結合したい場合があります。 必要なすべての機能をバックグラウンド クエリの「実行完了時」スクリプトに組み込むことが難しい場合があります。
解決
各クエリは、すべてのスクリプト (クエリと元のスクリプト) がアクセスできる新しい名前空間に結果を保存します。元のスクリプトは、続行する前に結果をチェックし続けます。
//Example script which runs queries in the background and references their results
//once finished.
Names default to here(1);
// Namespace to share data between background query and this script
ns = new namespace( "queries" );
// Flags which the background query will set to 1 when the background query is complete
ns:query1isdone = 0;
ns:query2isdone = 0;
// Open a window to display results
win = New window("Query Status", show menu(0), show toolbars(0),
text box("Status of queries:"),
tb = tablebox( string col box( "Query" , { "Query 1", "Query 2" } ),
string col box( "Status", { "Not Started", "Not Started" } ) ),
tbStatus = text box("Starting queries.")
);
wait(0); //make sure window shows up
// Define and start background queries
// First Query
sql_query1 = New SQL Query(
Connection( "ODBC:DSN=Test Source;DATABASE=Test Database;" ),
QueryName( "Query" ),
Select( vars ),
From( table ),
Where( condition )
);
sql_query1 << Run Background( OnRunComplete(
Names default to here(1);<BR /> ns = namespace( "queries" );
ns:dt1 = queryResult;
ns:query1isdone = 1;
) );
// Second Query
sql_query2 = New SQL Query(
Connection( "ODBC:DSN=Test Source;DATABASE=Test Database;" ),
QueryName( "Query" ),
Select( vars ),
From( table ),
Where( condition )
);
sql_query2 << Run Background( OnRunComplete(
Names default to here(1);<BR /> ns = namespace( "queries" );
ns:dt2 = queryResult;
ns:query2isdone = 1;
) );
// Every second check if the query is done (timeout after 10 seconds)
i=0;
allqueriesdone = 0;
starttime = tick seconds();
while( ( i < 10 ) & allqueriesdone == 0 ,
i++;
wait(1);
if( ns:query1isdone == 1,
tb << delete row( 1 );
tb << insert row( 1, {"Query 1", "Complete"} );,
tb << delete row( 1 );
tb << insert row( 1, {"Query 1", "Still Running"} );
);
if( ns:query2isdone == 1,
tb << delete row( 2 );
tb << insert row( 2, {"Query 2", "Complete"} );,
tb << delete row( 2 );
tb << insert row( 2, {"Query 2", "Still Running"} );
);
if( (ns:query1isdone == 1 ) & (ns:query2isdone == 1 ), allqueriesdone = 1 ); //indicate that everything finished
tbStatus << Set Text( "Queries are running, " || format(tick seconds() - starttime, "Fixed Dec", 12, 1) || " seconds elapsed." );
win << bring window to front;
);
// Show an error if any queries didn't finish
if( allqueriesdone == 0,
tbStatus << Set Text("Error, a query didn't finish and is still running!"),
tbStatus << Set Text("Queries finished after " || format(tick seconds() - starttime, "Fixed Dec", 12, 1) || " seconds.");
//win << Close Window; //could close window here
);
// Now reference the data tables
show( ns:dt1 );
show( ns:dt2 );クエリをバックグラウンドで実行したいが、結果を操作する必要があるとします。この方法では、結果を操作する前に複数のバックグラウンド クエリを完了できます。
公共事業Re: バックグラウンドでクエリを実行し、完了するまで待ち、残りの JSL スクリプトで参照するこんにちは@MarkDayton 、
先ほど修正したスクリプトの不備をご指摘いただき、詳しく調べていただきありがとうございます。 OnRunComplete スクリプトの名前のデフォルトが here(1) になっていなかったため、計画どおりに動作しませんでした。更新前と更新後の名前空間の説明は次のとおりです。ただ作った:
概要
名前空間「クエリ」がどのように機能するかに注意してください。作成した親スクリプト内で参照したOnRunComplete スクリプト内。変数 ns 自体は、名前空間「queries」を参照するためにのみ使用されます。たとえば、新しいスクリプト ウィンドウで次を実行できます。
Names default to here(1);
ns = New Namespace("queries");
ns:a = 1
2 番目のスクリプト ウィンドウは、次の呼び出しによって a の値を取得できます。
Names default to here(1);
Show(Namespace("queries"):a);
ただし、別のウィンドウでは ns に簡単にアクセスできません。 ただし、別のウィンドウで新しい変数を定義し、同様の方法で変数にアクセスできます。
Names default to here(1);
nsreference = Namespace("queries");
Show(nsreference);
または、コードを読みやすくするために、両方のウィンドウで同じ変数名を使用することもできます。変数自体は異なる名前空間で定義されているため異なりますが、同じものを参照するため、同じように使用できます。
Names default to here(1);
ns = Namespace("queries");
Show(ns:a);
上記のサンプル スクリプトでの変数の使用方法は次のとおりです。「ns」と呼ばれる変数が、名前付き名前空間「queries」を参照する各 here 名前空間に作成され、これらのスクリプト間で値を共有しやすくなります。
変更前- 名前のデフォルトを here(1) にして各 OnRunComplete スクリプトを開始せずにこれがどのように機能するか:
もっと見る...
変更後- スクリプトが現在どのように動作するか
スクリプトでは 4 つの名前空間が使用されます。
- 親スクリプト ウィンドウの here 名前空間
- 最初のクエリの OnRunComplete スクリプトの here 名前空間
- 2 番目のクエリの OnRunComplete スクリプトの here 名前空間
- 「queries」という名前の名前空間。親スクリプトと 2 つの OnRunComplete スクリプトの両方によって参照されます。
親スクリプトの変数 ns は、ここの名前空間で次のように定義されます。参照New Namespace() で作成されるクエリ名前空間。つまり、スクリプト ウィンドウのみが ns にアクセスできますが、JMP のそのインスタンス内の他のものは、ns によって参照されるクエリ名前空間内に保存されているものを参照できます。
OnRunComplete スクリプトは新しい環境で開かれ、親スクリプトの here 名前空間にはアクセスできません。したがって、ns とも呼ばれる新しい変数がそのスクリプトの here 名前空間で定義され、Namespace() を使用して 'queries' 名前空間を参照するように設定されます。各実行完了スクリプトは、独自の here 名前空間に ns と呼ばれる独自の変数を作成しますが、各変数は同じ 'queries' 名前空間を参照するように設定されます。
Re: バックグラウンドでクエリを実行し、完了するまで待ち、残りの JSL スクリプトで参照するまず、このスクリプトをありがとうございます。 名前空間の使用、SQL クエリのスクリプト作成、それらが完了したかどうかのテスト、ステータスのフィードバックを提供し、結果を管理します。このスクリプトは、多くの内容を JSL の数行に詰め込んでいます。ほとんどのことはフォローできますが、名前空間の定義と使用の経験があまりないので、質問があります。
スクリプトの 2 行目で、 nsはとして定義される:
ns = new namespace( "queries" );
そうすると、どうやらns Run Background() ステートメントで再定義されます。
sql_query2 << Run Background( OnRunComplete(
ns = namespace( "queries" );
ns:dt2 = queryResult;
ns:query2isdone = 1;
) );
sql_query1 および 2 内の名前空間は、スクリプトの先頭で定義されたものと同じ名前空間ですか。そうである必要があるようです。それとも、クエリ ステートメントに対してローカルな名前空間です。名前のデフォルトはここ(1)冒頭の発言? どしてns Run Background() ステートメント内で定義する必要がありますか?
シンプルで明確で美しいコードをありがとうございます。
Re: バックグラウンドでクエリを実行し、完了するまで待ち、残りの JSL スクリプトで参照するそれでも、困ったときに参照するには便利なコードです。 
Re: バックグラウンドでクエリを実行し、完了するまで待ち、残りの JSL スクリプトで参照するこんにちは@バイロン_JMP 、
対話的に実行されるクエリのステータスを確認することが目的である場合、ユーザーはクエリ ビルダー以外を見る必要はないことに私は同意します。このステータス ウィンドウは、完了後のスクリプト内の結果の参照など、単純な Web 検索ではユーザーが見つけるのが難しいクエリの操作部分を示すことを目的としていました。 正直に言うと、最小限の例を思いつくのに苦労したのを覚えています。もっと良い使用例があると確信しています...
Re: バックグラウンドでクエリを実行し、完了するまで待ち、残りの JSL スクリプトで参照するこれは非常に興味深いプロジェクトのアイデアのように思えます。
クエリ ビルダーには、実行中のクエリの数とその進行状況を確認できる [進行状況] タブがあることに注意してください。 おそらくこれは、情報を最初から取得しようとするのではなく、クエリ ビルダー プラットフォームをスクリプト化してこの情報を表示する方法になるでしょうか?