JMP 커뮤니티 안녕하세요.
이번이 처음으로 게시물을 올리는 것이자 첫 번째 대규모 JMP 스크립팅 프로젝트이므로 양해해 주십시오. 이 포럼은 지금까지 제가 있는 위치를 파악하는 데 큰 도움이 되었습니다.
목표: 각 자산 번호에 대한 IR 차트를 표시하는 디렉터리에 있는 모든 Excel 파일을 열고 구문 분석하는 하나의 JMP 대시보드가 있습니다. 대시보드/스크립트가 열릴 때마다 실행되고 차트가 업데이트된다는 점에서 라이브입니다.
제약: Excel 보고서의 레이아웃을 변경할 수 없습니다.
다음은 독립적으로 잘 작동하는 코드 스니펫입니다. 모든 것을 종합했을 때 JMP가 충돌했습니다.
나는 이것에 모두 잘못 접근하고있을 수 있습니다. 각 파일을 열고 열을 새 데이터 테이블에 추가하는 것이 더 쉬울 수 있습니다. X 수의 차트를 생성할 수 있는 열 수를 기반으로 합니다.
도움을 주시면 감사하겠습니다.
참조선이 있는 관리도를 만드는 코드 . 첨부된 스프레드시트에서 참조선 값을 가져오려고 합니다. 강제 요구사항 필드 및 제목 자산 번호 필드.
더보기... 디렉토리의 모든 파일을 여는 코드 , 그러나 파일이나 데이터가 작동하려면 헤더 행 1과 데이터 시작 행 2가 있어야 합니다.
더보기...dirpath = Pick Directory();
TheFileList = Files In Directory( dirpath );
For( i = 1, i < 100, i++,
dt = Open( "F:\IPC\IPC PULL TEST RECORD LOGS\" || TheFileList[i], worksheet( "Sheet1" ) );
dt << Control Chart(
Sample Label( :Date ),
Group Size( 1 ),
KSigma( 3 ),
Chart Col( :Pull Force Reading, Individual Measurement ),
SendToReport(
Dispatch(
{"Individual Measurement of Pull Force Reading"},
"2",
ScaleBox,
{Min( 5 ), Max( 18 ), Inc( 2 ), Minor Ticks( 1 ), Add Ref Line( 8, "Solid", "Black", "LSL", 4 )}
),
Dispatch(
{"Individual Measurement of Pull Force Reading"},
"1",
ScaleBox,
{Min( 0 ), Max( 50 ), Inc( 8 ), Minor Ticks( 0 )}
),
Dispatch( {"Individual Measurement of Pull Force Reading"}, "IR Chart of IM", FrameBox, {Frame Size( 820, 420 )} ),
Dispatch( {"Individual Measurement of Pull Force Reading"}, "IR Chart of IM", FrameBox( 2 ), {Frame Size( 65, 405 )} )
)
);
);dirpath = 디렉토리 선택(); TheFileList = 디렉토리에 있는 파일( dirpath ); For( i = 1, i < 100, i++, dt = Open( "F:\IPC\IPC PULL TEST RECORD LOGS\" || TheFileList[i], worksheet( "Sheet1" ) ); dt << 컨트롤 차트( Sample Label( :Date ), 그룹 크기( 1 ), KSigma( 3 ), Chart Col( : 인장력 판독, 개별 측정 ), SendToReport( Dispatch( {"인장력 판독 개별 측정"}, "2", ScaleBox , {Min( 5 ), Max( 18 ), Inc( 2 ), Minor Ticks( 1 ), Add Ref Line( 8, "Solid", "Black", "LSL", 4 )} ), Dispatch( {" 인장력 판독값 개별 측정"}, "1", ScaleBox, {Min( 0 ), Max( 50 ), Inc( 8 ), Minor Ticks( 0 )} ), Dispatch( {"인장력 판독값 개별 측정" }, "IM의 IR 차트", FrameBox, {Frame Size( 820, 420 )} ), Dispatch( {"인장력 판독값의 개별 측정"}, "IM의 IR 차트", FrameBox( 2 ), {Frame Size ( 65, 405 )} ) ) ); );
헤더와 데이터를 재정렬하여 하나의 파일을 포맷하는 코드 .
더보기...dt = Open("F:\IPC\IPC PULL TEST RECORD LOGS\Asset# 3042.xlsx", worksheets("sheet1"));
dt << Delete rows (1::13);
var = dt:column 11[2];
dt:column 11[8] = var; //data
var = dt:column 11[1];
dt:column 11[7] = var; //heading
var = dt:column 3[1];
dt:column 12[7] = var; //heading
var = dt:column 3[2];
dt:column 12 [8] = var; //asset #
dt << delete rows (1::6);
dt << delete columns(1,3,5,7,9,13::25);
colNames = dt << get column names;
For( i = 1, i <= N Items( colNames ), i++,
Column( i ) << set name( Column( i )[1] )
);
dt << delete rows(1);dt = Open("F:\IPC\IPC PULL TEST RECORD LOGS\Asset# 3042.xlsx", worksheets("sheet1")); dt << 행 삭제(1::13); var = dt:열 11[2]; dt:열 11[8] = var; //데이터 var = dt:열 11[1]; dt:열 11[7] = var; //제목 var = dt:열 3[1]; dt:열 12[7] = var; //제목 var = dt:열 3[2]; dt:컬럼 12 [8] = var; //자산 번호 dt << 행 삭제(1::6); dt << 열 삭제(1,3,5,7,9,13::25); colNames = dt << 열 이름 가져오기; For( i = 1, i <= N Items( colNames ), i++, Column( i ) << set name( Column( i )[1] ) ); dt << 삭제 행(1);
짐,
조사 및 문제 해결 과정에서 귀하가 많은 토론에 기여하는 것을 보았습니다. 여기에서 제 토론에 기여하게 된 것을 진심으로 영광으로 생각합니다.
처음에는 스크립트를 실행하는 동안 몇 가지 문제가 있었습니다. 로그와 디버거를 살펴본 후 특정 파일에서 중지되고 있음을 발견했습니다. 그 다음 파일은 제가 포맷을 다르게 한 테스트 파일이었습니다. 해당 파일을 제거하고 스크립트를 변경하지 않았으며 아름답게 일했다 . 나중에 스크립트를 실행할 때 파일이 열려 있었고 다른 오류가 발생했지만 쉽게 수정했습니다(파일 닫기).
코드 전체를 이해하려고 하지만 몇 가지 추가 사용자 지정이 있습니다. 도움이 되었으면 합니다.
- 그래프에 LSL 값을 추가하고 UCL/LCL과 같은 쪽(오른쪽)으로 이동할 수 있습니까?
- 일부 데이터 세트의 LSL은 50+입니다. 이것은 현재 그래프에 맞지 않으므로 범위를 1 - 100으로 수정했습니다. 당기는 힘 요구 사항을 범위에 대해 +/- 10 또는 20으로 사용하는 방법이 있습니까?
- 일부 Excel 시트가 비어 있습니다. 그래프를 생략하는 방법이 있습니까?
편집하다 : 오늘은 위의 커스터마이징을 추가하기 위해 시간을 좀 들였는데 위의 내용을 수정한 코드입니다. 참조 레이블을 변경하는 것이 상당히 어려운 것 같습니다. 내가 찾은 유일한 힌트는 새 텍스트 상자를 만들고 해당 코드를 사용하는 것이었지만 참조선의 Y 높이를 연결하는 방법은 확실하지 않았습니다.
Names Default To Here( 1 );
// Delete the old Dashboard
Try( NW << close window );
dirpath = Pick Directory();
TheFileList = Files In Directory( dirpath );
// Create the Dashboard window to place the charts into
NW = New Window( "Asset Dashboard", <<JOURNAL>col=Column( Current Data Table(), "Pull Force Reading");
tableVal = col[22];
if (tableVal == "", i++);
// Capture the Force Requirement value and add it to the graph if it is valid
dt:Pull Force Reading << data type( numeric ) << modeling type( continuous );
theForceRequirement = Num( Word( 1, dt:Force Requirement[1], " " ) );
If( Is Missing( theForceRequirement ) == 0,
<STRONG>range = theForceRequirement;</STRONG>
theForceRequirement = ",Add Ref Line(" || Char( theForceRequirement ) || ", \!"Dashed\!", \!"Black\!", \!"LSL\!", 4 )";,
theForceRequirement = " "
);
// Capture the Asset number
If( dt:Name( "Asset#" )[1] == "",
theAsset = "Unknown",
theAsset = dt:Name( "Asset#" )[1]
);
// Generate the code to produce the chart along with the LSL value
theExpr =
"cc = Control Chart(invisible,
Sample Label( :Date ),
Group Size( 2 ),
KSigma( 3 ),
Chart Col( :Pull Force Reading, Individual Measurement(Show Zones( 1 ), Shade Zones( 1 ),Test 1( 1 ), Test 3( 1 ))),
SendToReport(
Dispatch(
{\!"Individual Measurement of Pull Force Reading\!"},
\!"2\!",
ScaleBox,
{Min( <STRONG>if( (range - 20) <= 0 , 0, range - 20)</STRONG> ), Max( <STRONG>range + 20</STRONG> ), Inc( 2 ), Minor Ticks( 1 )"
|| theForceRequirement ||
" }
),
Dispatch(
{\!"Individual Measurement of Pull Force Reading\!"},
\!"1\!",
ScaleBox,
{Min( 0 ), Max( 50 ), Inc( 8 ), Minor Ticks( 0 )}
),
Dispatch(
{\!"Individual Measurement of Pull Force Reading\!"},
\!"IR Chart of IM\!",
FrameBox,
{Frame Size( 820, 420 )}
),
Dispatch(
{\!"Individual Measurement of Pull Force Reading\!"},
\!"IR Chart of IM\!",
FrameBox( 2 ),
{Frame Size( 65, 405 )}
)
)
);";
// Run the generated code
Eval( Parse( theExpr ) );
// Close the outline box of the output and set the title based upon the asset value
Report( cc )[Outline Box( 1 )] << Close( 1 ) << set title( "Asset# " || theAsset );
// Append the display output to the display window
VLB << Append( Report( cc ) );
// Clean up the environment by closing the display window and the data table
//cc << close window;
//Close( dt, nosave );
); // End of For Loop</JOURNAL>
나는 이것이 당신이 원하는 것에 가깝다고 생각합니다.약간의 트위킹이 필요할 수 있지만 최소한 이 모든 것을 하나로 모으는 방법에 대한 좋은 시작을 제공해야 합니다.
Names Default To Here( 1 );
// Delete the old Dashboard
Try( NW << close window );
dirpath = Pick Directory();
TheFileList = Files In Directory( dirpath );
// Create the Dashboard window to place the charts into
NW = New Window( "Asset Dashboard", <<JOURNAL></JOURNAL>