JSL이 버전 19에서는 작동하지 않지만 버전 17에서는 작동합니다.JMP 17에서 JMP 19로 업그레이드했습니다. JMP 17에서는 잘 작동하던 복잡한 루틴이 JMP 19에서는 실패합니다. 다른 오류도 있을 수 있지만, 가장 먼저 발생하는 문제는 가져온 데이터의 알려진 오류를 수정하기 위해 행을 선택하는 부분입니다. 디버깅을 해보니 'Get Rows Where' 명령이 빈 행렬을 반환하는 것을 확인했습니다. 대상 행이 데이터 테이블에 존재하고 메뉴 창에 조건을 입력하여 강제로 선택할 수 있다는 것도 확인했습니다.
row_to_update = newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0);
후속 명령은 row_to_update가 다음을 반환하기 때문에 해당 행에 대해 원하는 수정을 수행하지 못합니다: [](0, 1)
newContrib는 이전에 데이터 테이블로 정의되었습니다. 변수 이름 위에 마우스를 올리면 팝업 창에 올바른 테이블이 표시됩니다.
문서를 참고하여 Where를 사용하도록 해당 줄을 수정해 보았지만, 결과는 동일했습니다.
row_to_update = newContrib[Where(:"request_id" == 263496 & :"line_no" == 0)];
릴리스 노트에서 관련 내용을 찾을 수 없었습니다. 도움말 설명서를 보니 구문은 올바른 것 같습니다.
무엇이 바뀌어서 더 이상 작동하지 않는지, 그리고 어떻게 고칠 수 있는지 설명해 주실 분 계신가요?
정말 감사합니다!
낸시
자동화 및 스크립팅제목: JSL이 버전 19에서는 작동하지만 버전 17에서는 작동하는 문제 관련<< JMP 19에서도 'Where()를 사용하여 행을 가져오는' 기능은 여전히 그 방식으로 작동합니다. 두 번째 명령(Where() 사용)은 약간 변경해야 합니다.
Names Default To Here( 1 );
dt= Open( "$SAMPLE_DATA/Big Class.jmp" );
row_to_update = dt<< Get Rows Where( :"name" == "JANE" & :"age" == 12 ); //[3]
row_to_update2 = Where( dt, :name == "JANE" & :age == 12 ); //[3]
row_to_update = Where( newContrib, :request_id == 263496 & :line_no == 0 );
문제의 원인이 무엇인지 궁금하시다면, 데이터 형식이 올바른지 확인해 보세요. JMP 19에서는 해당 열을 문자열로 가져오는데, JMP 17에서는 숫자로 가져오는 것은 아닌가요? << Get Rows Where 구문은 변경되지 않았으므로, 아마도 이와 같은 간단한 문제일 가능성이 높습니다.
제목: JSL이 버전 19에서는 작동하지만 버전 17에서는 작동하는 문제 관련안녕하세요, 낸시님.
[](0,1)은 row_to_update가 빈 리스트이므로 데이터 테이블에 일치하는 행이 없음을 의미합니다. Get Rows Where ()는 리스트를 반환하므로 아래 스크립트의 다른 접근 방식을 사용하는 것이 더 나을 수 있습니다.
names default to here (1);
newContrib = New Table( "newContrib",
Add Rows( 3 ),
New Column( "request_id",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [263496, 263496, 263496] )
),
New Column( "line_no",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [0, 0, 1] )
)
);
row_to_update = newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0);
//row_to_update is [1,2]
row_to_update = newContrib << Get Rows Where(:"request_id" == 263497 & :"line_no" == 0);
//row_to_update is empty: [](0, 1)
row_to_update = (newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0))[1];
//row_to_update is 1
//a different approach:
rows_to_update = newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0);
if (n items(rows_to_update) > 0, row_to_update = rows_to_update[1]);
제목: JSL이 버전 19에서는 작동하지만 버전 17에서는 작동하는 문제 관련Where 절의 올바른 구문에 대한 설명과 Get Rows Where 절의 구문이 변경되지 않았다는 것을 확인해 주셔서 감사합니다. 무엇보다 데이터 형식을 확인해 보라는 제안을 해주셔서 정말 감사드립니다! 실제로 문제가 바로 그것이었습니다(정수가 문자열로 가져와지고 있었습니다). 사실, 이전에는 다양한 데이터 형식으로 자동으로 인식되었던 12개 시트의 모든 데이터가 이제 문자열로 가져와지고 있었습니다. 이렇게 기본적인 가져오기 동작 변경 사항을 전혀 생각지도 못했는데, 기본으로 돌아가서 확인해야 한다는 것을 알려주셔서 정말 감사합니다! 게다가, "Get Rows Where"를 사용하는 수백 줄의 코드 구문을 바꾸는 것보다 열의 데이터 형식을 변경하는 코드를 추가하거나 열기 명령 설정을 다시 검토하는 것이 훨씬 간단한 해결책입니다!
정말 감사합니다.
낸시
제목: JSL이 버전 19에서는 작동하지만 버전 17에서는 작동하는 문제 관련잘 작동한다니 다행입니다. 한 가지 덧붙이자면, 스크립트를 Where() 함수를 사용하도록 업데이트하는 것이 좋을 것 같습니다. 성능 향상이 상당히 큽니다. 예를 들어, 백만 개의 행이 있는 테이블에서 이 코드를 실행해 봤는데, Where() 함수가 << 조건문보다 약 10배 정도 빨랐습니다.
Names Default to Here( 1 );
dt = Current Data Table();
now = HP Time();
row_to_update = dt << Get Rows Where( :request_id == 220681 & :line_no == 70 );
then = HP Time();
elapsed = then - now;
Show( elapsed ); //119053
Wait( 2 );
now = HP Time();
row_to_update = Where( dt, :request_id == 220681 & :line_no == 70 );
then = HP Time();
elapsed = then - now;
Show( elapsed ); //11777