열려 있는 모든 테이블을 표시하는 목록 상자열려 있는 모든 데이터 테이블을 나열하고 새로 열거나 새로 닫은 테이블로 자동 업데이트되는 목록 상자를 만들려고 합니다. 아래 스크립트로 시작했지만 어떤 이유로 onClose 함수가 작동하지 않습니다.
도움을 주셔서 감사합니다 
names default to here(1);
f1 = function ({Temp_list},
T_list = Temp_list << get name();
lb << remove all;
lb << append (T_list)
);
f2 = function ({Temp_list},
T_list = Temp_list << get name();
lb << remove all;
lb << append (T_list)
);
asub = Subscribe to data table list( , onopen(f1));
Subscribe to data table list(asub , onclose(f2));
nw = new window("Trial",show menu(0),
vlistbox(
T_list = get data table list ();
lb = listbox(T_list);
)
);
고급 통계 모델링자동화 및 스크립팅소비자 및 시장 조사데이터 접근데이터 혼합 및 정리실험 설계대량 맞춤화Re: 열려 있는 모든 테이블을 표시하는 목록 상자Subscribe to data table list를 좀 더 테스트한 후 가능하면 이를 피하겠습니다. 전혀 제대로 작동하지 않는 것 같고, 이벤트가 실행되지 않고, 사용 방법에 대한 상당히 잘못된 문서가 있는 것 같습니다. Windows 10에서 JMP16.1.0 Pro를 사용하고 있습니다.
이와 같은 것을 갖고 싶은 애플리케이션이 하나 있는데, 데이터 테이블 목록 새로 고침이나 이와 유사한 것을 추가할 것 같습니다.
Re: 열려 있는 모든 테이블을 표시하는 목록 상자감사해요 @jthi ! 작동합니다!
괜찮으시다면 "OnRename" 절을 어떻게 설정하는지 보여주실 수 있나요?
Re: 열려 있는 모든 테이블을 표시하는 목록 상자lb에 새 값을 추가하고 인덱스가 있는 닫힌 값만 제거하고(인덱스를 얻기 위해 Contains()를 사용) 함수에 지역 변수도 추가할 수 있어야 합니다.
Names Default To Here(1);
f1 = function ({Temp_list}, {tableList},
tableList = Temp_list << get name();
lb << append (tableList)
);
f2 = function ({Temp_list}, {tableList},
tableList = Temp_list << get name();
lb << Remove Item(Contains(lb << get items, tableList));
);
asub = Subscribe to data table list( , onopen(f1));
Subscribe to data table list(asub , OnClose(f2));
nw = new window("Trial",show menu(0),
vlistbox(
lb = listbox(get data table list ());
)
);Re: 열려 있는 모든 테이블을 표시하는 목록 상자감사해요 @txnelson !! 제가 만난 버그가 바로 그것입니다. 그동안 이에 대한 해결 방법을 찾아야 할 것 같습니다.
Re: 열려 있는 모든 테이블을 표시하는 목록 상자아래 JSL을 사용하여 내가 발견한 내용은 다음과 같습니다.
Names Default To Here( 1 );
f2 = Function( {Temp_list},
T_list = Get Data Table List();
lb << remove all;
lb << append( T_list );
show("Close");
);
f1 = Function( {Temp_list},
T_list = Get Data Table List();
lb << remove all;
lb << append( T_list );
show("add");
);
asub = Subscribe to Data Table List( , onopen( f1 ) );
Subscribe to Data Table List(asub , onclose( f2 ) );
nw = New Window( "Trial",
Show Menu( 0 ),
V List Box(
T_list = Get Data Table List();
lb = List Box( T_list );
)
);
- 생성된 목록 상자에는 오류 없이 새 데이터 테이블이 추가됩니다.
- f1 함수는 추가할 때마다 한 번씩 실행됩니다.
- 데이터 테이블을 닫아도 목록 상자에서 제거되지 않습니다.
- 두 번째 데이터 테이블을 닫으면 이전에 닫힌 데이터 테이블이 목록 상자에서 제거됩니다.
- 목록 상자를 닫고 JSL을 두 번째로 실행하고 데이터 테이블을 닫으면 f2 함수가 두 번 실행됩니다.JSL의 첫 번째 실행에서 f2 함수가 실행되고 이어서 f2 함수의 두 번째 인스턴스가 실행됩니다.이는 Show() 문을 변경하여 표시할 수 있습니다.Show 문이 다음에서 변경된 경우
Show( "Close" );
에게Show( "Close 2" );
데이터 테이블을 닫으면 Show() 문의 두 버전이 모두 표시됩니다.
- 이후에 JSL을 실행하면 f2 함수의 추가 복사본이 추가되며, 각 복사본은 각 데이터 테이블이 닫힐 때마다 실행됩니다.
- Clear Globals 및 Clear Symbols는 f2 함수의 이전 버전을 제거하지 않습니다.
이는 분명히 JMP 버그이므로 JMP 지원 담당자에게 보내야 합니다.
나는 그들에게 버그를 제출했습니다.
Re: 열려 있는 모든 테이블을 보여주는 목록 상자저는 몇 가지 새로운 발견으로 이 주제를 끌어올립니다. 누군가에게 도움이 될지도 모릅니다. 저는 @디제이틴 과 비슷한 것을 시도했고 여기에 설명된 것과 동일한 모든 문제에 부딪혔는데, 대부분 여기에서의 토론 덕분에 해결했습니다.
제가 추가할 수 있는 것은 @txnelson 이 설명한 이상한 행동에 대한 설명입니다. 문제는 아래와 같이 구독 이름을 명시적으로 명시하지 않고 구독하는 경우입니다.
asub = Subscribe to data table list( , OnOpen( Show("opening...") ) )스크립트를 실행할 때마다 새 일반 이름("_DTListSubscriber123")으로 새 구독이 생성되고 마지막에 카운터가 증가합니다.
비결은 스크립트를 실행할 때마다 동일한 구독자를 덮어쓰도록 구독자 이름을 명시적으로 지정하는 것입니다. 예:
asub = Subscribe to data table list( "MyDTLSub1", OnOpen( Show("opening...") ) )또는 마지막에 구독을 취소하려면 < <>
Unsubscribe to data table list( asub, "ALL" )
다른 뉴스로, @디제이틴 , 이름 변경은 꽤 간단하게 작동합니다. 이벤트는 이름 변경 후에 트리거되는 듯하므로 Get Data Table List()가 새 이름을 가져옵니다. 하지만 설명서가 부족해서 작동시키기 전에 다른 이유로 머리를 쥐어뜯었습니다. OnOpen 및 OnClose와 달리 OnRename 함수에는 인수 2개(새 이름/테이블 및 이전 이름/테이블)가 필요합니다. 그렇지 않으면 오류가 발생합니다. 그리고 이 특정 목록 상자 예제에서는 실제로 필요하지 않지만 필요하다면 서로 다른 변수 유형이라는 점도 명심해야 합니다. 하나는 테이블이고 다른 하나는 문자열입니다(아래 참조).
Names Default To Here(1);
f = Function ( { new_name_as_table, old_name_as_string },
print(asub||" renaming: "|| old_name_as_string || " to " || (new_name_as_table << get name) );
lb << set items( Get Data table List() );
);
asub = Subscribe to data table list( "MySub", OnRename( f ) );
nw = new window("Trial",show menu(0),
<< On Close(Unsubscribe to data table list( asub, "ALL")),
vlistbox(
lb = listbox(get data table list ());
)
);
dt = Open( "$SAMPLE_DATA/Tiretread.jmp" );
dt << set name( (dt<<GET name=""></GET>Otherwise I agree with general sentiment that the subscriber it's very hard to work with, you have to be really careful to tie up all the loose ends. Better documentation would be much appreciated.