나는 다음을 받았습니다. 내가 논의하고 싶은 공식 거의 3년전부터 @txnelson , 그 이후로 결코 놓지 않았고 지금까지 여러 번 생각하면서 천천히 스크립팅을 좀 더 진지하게 이해하게 되었습니다. 그동안 저를 구해준 공식은 많이 시간의.
아래 예에서는 동일한 수식을 매번 조금씩 변형하면서 3번 추가합니다. 제가 논의하고 싶은 문제는 새로 추가된 수식 열을 포함하여 테이블의 테이블 스크립트를 복사하고 실행할 때 발생하는 다양한 오류 메시지입니다.
Names Default To Here( 1 );
// first, we need an example table
dt = New Table( "ExampleTable",
Add Rows( 24 ),
New Column( "BatchId",
Character,
"Nominal",
Set Values(
{"A", "A", "A", "A", "A", "A", "B", "B", "B", "C", "C", "C", "D", "D",
"D", "E", "E", "E", "F", "F", "F", "G", "G", "G"}
)
),
New Column( "StorageCondition",
Character,
"Nominal",
Set Values(
{"25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "5°C", "5°C", "5°C",
"25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "25°C/60%RH",
"25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "25°C/60%RH",
"25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "25°C/60%RH",
"25°C/60%RH", "25°C/60%RH", "25°C/60%RH"}
)
),
New Column( "Time",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
)
),
New Column( "QcParameter",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[0.2, 0.3, 0.4, 0.2, 0.21, 0.22, 0.3, 0.9, 1.2, ., 0.2, 0.4, 0.1, ., 0.1,
0, 0, 0, 0.1, 0, 0, 0, 0.1, 0]
)
)
);
// adding formula column via approach nr. 1<BR />// this adds the formula alright, but when copying and executing the resulting table script will leave the formula column empty<BR />// no need to discuss this, because this obviously missing the 'eval(eval expr(expr()))' wrapping (see screenshot below)
dt << New Column( "QcParameter [% rel.]_1",
numeric,
formula(
curBatch = :BatchId;
curCondition = :StorageCondition;
theRows = dt << get rows where(
:BatchId == curBatch & :StorageCondition == curCondition & :Time == 0
);
d0Row = theRows[1];
d0Time = :QcParameter[d0Row];
(100 * :QcParameter / d0Time);
)
);
// adding formula column via approach nr. 2<BR />// this will fill the formula column as desired when copying and running the table script with the added formula columns<BR />// but it will also throw an error message when new rows are added to the table then (see screenshot below)
Eval(
Eval Expr(
dt << New Column( "QcParameter [% rel.]_2",
numeric,
formula(
curBatch = :BatchId;
curCondition = :StorageCondition;
theRows = Expr( dt ) << get rows where(
:BatchId == curBatch & :StorageCondition == curCondition & :Time == 0
);
d0Row = theRows[1]; // removed from approach nr. 3
d0Time = :QcParameter[d0Row];
(100 * :QcParameter / d0Time);
)
)
)
);
// adding formula column via approach nr. 3
// this will fill the formula column as desired when copying and running the table script with the added formula columns<BR />// and it will NOT throw an error message when new rows are added to the table then (see screenshot below)
Eval(
Eval Expr(
dt << New Column( "QcParameter [% rel.]_3",
numeric,
formula(
curBatch = :BatchId;
curCondition = :StorageCondition;
theRows = Expr( dt ) << get rows where(
:BatchId == curBatch & :StorageCondition == curCondition & :Time == 0
);
d0Time = :QcParameter[theRows];
(100 * :QcParameter) / d0Time;
)
)
)
);
추가 수식 열을 사용하여 테이블 스크립트를 다시 실행할 때 수식 열 "QcParameter [%r rel.]_1]"에 대한 오류 메시지 스크린샷:

추가 수식 열을 사용하여 테이블 스크립트를 다시 실행할 때 수식 열 "QcParameter [%r rel.]_2]"에 대한 오류 메시지 스크린샷:

추가 수식 열을 사용하여 테이블 스크립트를 다시 실행할 때 수식 열 "QcParameter [%r rel.]_3]"에 대한 오류 메시지 스크린샷:

제가 이렇게 긴 질문을 드리는 이유는 제가 가정하기 때문입니다. 접근 nr에 변수 "d0Row"가 사용된 데는 어떤 이유가 있을 것입니다. 2, 아니?접근 번호의 경우. 3 간단히 이 변수를 삭제했고(아래 스크린샷 참조) 결과적으로 수식이 "훨씬 더 훌륭하게" 작동합니다. 즉, 새 행이 데이터 테이블에 포인트 앤 클릭 방식으로 임시 추가될 때 오류 메시지가 없습니다.

따라서 내 질문은 "d0Row" 변수를 삭제하여 뭔가 잘못하고 있는지입니다. 실제로는 더 큰 데이터 테이블을 사용하여 작업하므로 각 행의 정확성을 개별적으로 확인할 수 없습니다.
귀하의 문제를 따르고 있는지 완전히 확신할 수는 없지만 dt에 대한 참조는 수식 1을 복사할 때 dt에 대한 참조가 누락된다는 것입니다.예제 2와 3에서는 데이터 테이블 "ExampleTable"을 가리키는 데이터 테이블 참조로 끝나고 데이터 테이블 이름은 표시된 대로 "Example Table 2"입니다.다시 한 번 귀하의 문제를 이해하고 있다면 "Current Daa Table()"을 사용하여 문제를 해결할 수 있다고 생각합니다.
curBatch = :BatchId;
curCondition = :StorageCondition;
theRows = Current Data Table() << get rows where(
:BatchId == curBatch & :StorageCondition == curCondition & :Time == 0
);
d0Row = theRows[1];
d0Time = :QcParameter[d0Row];
If( Row() == 11,
Show( therows, d0Time )
);
(100 * :QcParameter) / d0Time;
감사해요! 다시 한번 요약해 보겠습니다.
- 이전에 공식 열이 없었던 예제 테이블에 세 개의 공식 열을 추가한 다음 이제 세 개의 공식 열이 포함된 테이블의 결과 테이블 스크립트를 복사하고 실행하면 예제 2와 3만 해당 공식 열을 예상 상대 값으로 채웁니다. . 첫 번째 수식 열은 비어 있습니다.
- 또한 1에서 생성된 최종 테이블에 새로운 행을 추가하는 경우. (즉, 이제 3개의 수식 열을 모두 포함하는 테이블 스크립트에서) 새 빈 행을 추가할 때 세 번째 예에서만 오류 메시지가 발생하지 않습니다.
이러한 관찰로 인해 예제 3의 일부에서 "d0Row" 변수를 제거했습니다. 이후에는 테이블에 새 행을 추가할 때 오류 메시지가 나타나지 않으며 예상대로 상대 데이터가 재생산됩니다. 따라서 문제는 "d0Row"가 전혀 필요한지 여부입니다. . 나는 이 가설을 테스트하기 위해 특별히 예제 3을 만들었습니다. ("d0Row"를 제거하면 공식이 더 짧아지지만 이 변수가 필수적이거나 뭔가를 간과하고 있다는 점이 걱정됩니다. 나는요?
이것이 수식에서 "현재 데이터 테이블()"을 사용하거나 사용하지 않는 것과 관련이 있는지 잘 모르겠습니다. 나는 오랫동안 해결 방법으로 "현재 데이터 테이블()"을 사용해 왔습니다. 테이블에 새 행을 추가할 때 여전히 오류 메시지가 표시되지만, 새 행이 추가될 때 테이블의 모든 관련 열에 대한 오류 메시지를 지속적으로 확인할 필요 없이 테이블에 새 행을 추가할 수 있기를 원합니다. 그 안에는 수십 개의 상대 열이 있으며 이 작업을 반복하는 데 시간이 걸립니다. 물론 평가를 억제하는 것도 가능하지만, 이 역시 시간이 걸린다. 이 예가 명확하지 않은 경우 사과드리며, 추가로 설명하겠습니다.)
이 질문과 정확히 관련이 없지만 일부 Col 함수 마법을 사용하여 수식을 "단순화"할 수 있습니다. 이러한 제안은 효과가 있지만 기존 작동 공식을 바꾸기 전에 이를 확인해야 합니다.
dt << New Column("FormulaA", Numeric, Continuous, Formula(
100 * :QcParameter / Col Sum(If(:Time == 0, :QcParameter, .),:BatchID, :StorageCondition)
));
그룹에 대해 Time 0이 항상 첫 번째가 되도록 데이터를 정렬하면 더 쉽게 이해할 수 있습니다(어쩌면).
dt << New Column("FormulaB", Numeric, Continuous, Formula(
100 * :QcParameter / QcParameter[Col Min(Row(), :BatchID, :StorageCondition)]
));