こんにちは、
列 (1) がタイムスタンプで、列 (2) がタグの値である個別のテーブルで各タグを開くときに、OSIsoft-PI コネクタからの値を水平方向に連結するアドインに取り組んでいます。を使用して回避策を見つけました"アップデート"どれの正常に動作します. しかし、私の最初の計画は使用することでした"加入"タイムスタンプがずれているときに行を収集することを回避し、「更新」戦略のように行を削除する最後のステップを回避します。残念ながら、さまざまなエラー メッセージが表示されたので、もっとよく理解したいと思います結合を機能させる方法(さらなるスクリプト作業用)。 手順とエラーの詳細、スクリプト (更新は機能しますが、結合は失敗します) とデータテーブルを含む添付の Word ドキュメントを見つけてください。
助けてくれてありがとう、私はチームの会議やドキュメントのために開いています。
エマニュエル
ボンジュール、 @Emmanuel_Romeu 、
あなたが言及した文書という単語が表示されません。
こんにちはエマニュエル、これを試すことができます。これは結合プロセスをループし、最小限の式しか処理しません。
Names Default To Here( 1 );
// List of opened files
file = Get Data Table List();
n_files = N Items( file );
joinCol = "Timestamp";
joinedDt = file[1];
For Each( {i}, 2 :: (n_files), // i =2;
Eval(
Eval Expr(
joinedDt = joinedDt << Join(
With( file[i] ),
By Matching Columns( Expr( Parse( Eval Insert( ":^joinCol^" ) ) ) = Expr( Parse( Eval Insert( ":^joinCol^" ) ) ) ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 ),
invisible
)
)
);
//set first column to join column name
Column( joinedDt, 1 ) << set name( joinCol );
//delete working files and prepare for next time through loop
Close( file[i], nosave );
Try( Close( oldJoin, nosave ) );
oldJoin = joinedDt;
);
Close( file[1], nosave );
//remove extra join columns
For Each( {i}, N Col( joinedDt ) :: 2,
If( Lowercase( Left( Column( joinedDt, i ) << get name, 9 ) ) == Lowercase( joincol ),
joinedDt << delete columns( i )
)
);
joinedDt << show window( 1 );
ブレイディ、ありがとうできます.
今は寝て、明日(または月曜日)にしようと思います理解するまさに使い方
。
ありがとうございました。
内容を確認した上でご不明な点がございましたら、お気軽にお問い合わせください。詳しく説明させていただきますので、お電話でお問い合わせください。
乾杯、
ブレイディ
修正するにはScript_Concatenate_Tags_w_JOIN_Fail_2 :
行 70 を次のように変更します。 Expr (dt_joined = dt_joined << Join(
行 80 を削除します。 Expr (dt_joined)、現在のデータ table() 、
私の意見では、現在のデータ テーブル()スクリプトの開始時に現在のテーブルを取得するためにのみ使用する必要があります。これは、参照しているテーブル (ユーザーが最後に触れたテーブル) を確実に知ることができる数少ない時間の 1 つであるためです。 他の多くの状況では、現在のテーブルは、実行中の操作、実行にかかる時間、処理中にユーザーが別のテーブルに触れたかどうか、基になるコードの変更が現在のものを引き起こしたかどうかに応じて、実行ごとに異なる場合があります。あるバージョンの表を次のバージョンで変更するなど。 ご利用方法現在のデータ テーブル()これが、スクリプトが「機能した」理由です (ファイルの 2 番目のテーブルを、選択したテーブルに結合しました)。 私は、テーブルは明示的にのみ参照されるべきだと強く信じています。 これが新しい 70 行目で行われていることであり、メッセージが送信されるテーブルと、結果のテーブルが渡される変数の両方であることが確実にわかっています。
式を使用してプラットフォームに列名を取得するのは、特に引数が複数の列を取ることができる場合は注意が必要です。 機能するものを見つける前に、ほとんどの場合、いくつかの異なることを試す必要があります. 私は、この機能が何年にもわたって進化し、幸いにもより良い (より柔軟な) 方向に変化していることを確信しています。 それでも、それは挑戦です。 @マークベイリーもっているコラムの操作に関する素晴らしい記事読むことをお勧めします。
の中にScript_Concatenate_Tags_w_JOIN_Fail_1スクリプト、最初の加入ブロック、問題はありませんパース、しかし列への参照をリストに挿入しようとしています(JMPは列を見つけられません)。 複数のステートメントを含めることができますが、代わりの(私はこれを頻繁に行います)、この場合は必要ありません。 直接入れることができます加入その番号の代わりにその名前を使用します(私は仕事に就くことができませんでした)。 その上、結合されたテーブルからすべての列を取得し、テーブルから最初の列を除くすべてを取得して、結合することができます。 コードを再配置して、テーブルと列を明示的に参照し、不要なテーブルをすぐに削除できるようにしました。
name = Get Data Table List(); <BR />For(i=1,i<=N Items(name),i++, name[i] = Head Name(name[i]));<BR /><BR />join1 = Data Table(1);
for (f=2, f<= N Items(name),f++,
colList1 = join1 << Get Column Names();
colList2 = Remove(Data Table(name[f]) << Get Column Names(),1);
Eval(
Substitute(
Expr (
dt_joined = join1 << Join(
With( join2 ),
Select(cl1),
SelectWith( cl2 ),
By Matching Columns( join1Col1 = join2Col1),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 )
)
) ,
Expr (join2), Data Table(name[f]),
Expr(cl1), Name Expr(colList1),
Expr(cl2), Name Expr(colList2),
Expr (join1Col1), Column(join1,1),
Expr (join2Col1), Column(Data Table(name[f]),1),
)
);
Close(join1,No Save);
Close(Data Table(name[f]),No Save);
join1 = dt_joined;
);
テーブル名を収集するためにテーブルを作成する必要はありません。 名前をリストに入れ、そこから作業する方がはるかに簡単です。 テーブルが大きい場合、これは少し扱いにくい場合があります。 使用するのに最適見えないまたプライベート中間テーブルを非表示にします。 問題は、私の知る限り、メッセージを使用して最終テーブルを再表示する方法がないことです。 テーブル全体を使用してサブセットを作成し、それを再表示できます。
こんにちはドン、ありがとう!!
*為にScript_Concatenate_Tags_w_JOIN_Fail_2、あなたが言ったように私が使用した現在のデータ テーブル ()それを機能させることはできますが、それが最善の方法ではないのではないかと疑っていました。 これで、解決策が dt_joined = dt_joined << Join() で非常に近いことがわかりましたが、自分で考えたことはなかったでしょう (今では「メッセージが送信されるテーブルと、結果のテーブルが渡される変数」については、今後考えていきたいと思います)。
*Script_Concatenate_Tags_w_JOIN_Fail_1 の場合、実際、適切なコマンドを使用すると、はるかに簡単になります (例: name[i] = Head Name(name[i] または colList2 = Remove(Data Table(name[f])) << Get Column Names(),1 )
それを達成するために複雑なものを構築するのではなく(知っておくとよい)。
ありがとうございました。