안녕하십니까,
열(1)이 타임스탬프이고 열(2)이 태그 값인 별도의 테이블에서 각 태그를 열 때 OSIsoft-PI 커넥터에서 오는 값을 수평으로 연결하는 추가 기능을 개발 중입니다.나는 다음을 사용하여 해결 방법을 찾았습니다. "업데이트" 어느 잘 작동 . 그러나 내 초기 계획은 "가입하다" 타임스탬프가 잘못 정렬되었을 때 행 수집을 피하고 "업데이트" 전략과 같이 행 삭제의 마지막 단계를 방지합니다.불행히도 나는 다양한 오류 메시지에 직면했고 더 잘 이해하고 싶습니다. 조인이 작동하도록 하는 방법 (추가 스크립팅 작업용). 단계 및 오류, 스크립트(업데이트 작동, 결합 실패) 및 데이터 테이블에 대한 자세한 내용이 포함된 첨부된 Word 문서를 찾습니다.
도움을 주셔서 감사합니다. 저는 팀 회의나 문서를 위해 열려 있습니다.
임마누엘
안녕 Emmanuel, 조인 프로세스를 반복하고 최소한의 표현식 처리만 있는 이것을 시도할 수 있습니다.
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 );
Brady님, 감사합니다. 효과가있다 .
이제 잠자리에 들고 내일(또는 월요일) 이해하다 바로 그거죠 작동 원리
.
고맙습니다.
살펴보신 후 궁금한 사항이 있으시면 말씀해 주시면 자세히 안내해 드리겠습니다./전화 드리겠습니다.
건배,
브래디
고치다 Script_Concatenate_Tags_w_JOIN_Fail_2 :
70행을 다음과 같이 변경합니다. Expr (dt_joined = dt_joined << Join(
80행 삭제: Expr(dt_joined), 현재 데이터 테이블(),
내 생각에, 현재 데이터 테이블() 어떤 테이블을 참조하고 있는지 확실히 알 수 있는 몇 안 되는 시간 중 하나이기 때문에 스크립트 시작 시 현재 테이블을 가져오는 데만 사용해야 합니다(사용자가 마지막으로 터치한 테이블). 다른 많은 상황에서 현재 테이블은 수행 중인 작업, 작업 시간, 처리 중 사용자가 다른 테이블을 건드렸는지 여부, 기본 코드의 변경으로 인해 현재 작업이 발생한 작업에 따라 실행마다 다를 수 있습니다. 한 버전의 테이블을 다음 버전에서 변경하는 등 당신이 사용한 방법 현재 데이터 테이블() 이것이 스크립트가 "작동"한 이유입니다(파일의 두 번째 테이블을 선택한 테이블과 결합했습니다). 나는 테이블이 명시적으로만 참조되어야 한다고 굳게 믿습니다. 이것은 새 줄 70에서 수행되는 작업입니다. 여기서 메시지가 전달되는 테이블과 결과 테이블이 전달되는 변수 모두임을 확실히 알 수 있습니다.
표현식을 사용하여 열 이름을 플랫폼으로 가져오는 것은 특히 인수가 여러 열을 가질 수 있는 경우 까다롭습니다. 나는 거의 항상 작동하는 것을 찾기 전에 몇 가지 다른 것을 시도해야 합니다. 나는 이 기능이 수년에 걸쳐 진화해 왔으며 다행히도 더 나은(더 유연하게) 변화했다고 확신합니다. 그래도 도전입니다. @Mark_Bailey 가지다 열 작업에 대한 좋은 글 읽기를 권장합니다.
에서 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 )
그것을 달성하기 위해 복잡한 물건을 만드는 것보다 (알아두면 좋습니다).
다시 감사합니다.