我想计算一个值是否超出添加到数据库的最后两个值的10%。当“权重”值接近10或100-110时,此计算不能给我正确的反馈。否则它可以正常工作。
Case (
Get(RecordNumber) ≤ 2 ; "Continue Collecting Data" ;
(((GetNthRecord ( Weight ; Get(RecordNumber)-2))*.9) ≤ Weight) and
(((GetNthRecord ( Weight ; Get(RecordNumber)-2))*1.1) ≥ Weight) and
(((GetNthRecord ( Weight ; Get(RecordNumber)-1))*.9) ≤ Weight) and
(((GetNthRecord ( Weight ; Get(RecordNumber)-1))*1.1) ≥ Weight);
"Stable";
"Unstable")
答案 0 :(得分:0)
我将首先假设您的表包含主键和创建时间戳的字段。如果没有,我强烈建议您同时添加此表和您创建的每个其他表。
假设这些字段已到位,您需要创建此布局所基于的表的另一个实例,然后通过笛卡尔(×)连接将主键与其自身相关联。按创建时间戳降序对关系进行排序。那么你的计算是:
Case (
(((GetNthRecord ( Weight ; 1 ) *.9 ) ≤ Weight) and
(((GetNthRecord ( Weight ; 1 ) *1.1 ) ≥ Weight) and
(((GetNthRecord ( Weight ; 2 ) *.9 ) ≤ Weight) and
(((GetNthRecord ( Weight ; 2 ) *1.1 ) ≥ Weight);
"Stable";
"Unstable")
我注意到的另一件事是你的代码有点复杂。 Let函数可以使事情更容易阅读,您的四个标准可以减少到两个差异是否超出范围。因此,更简单的版本变为:
Let ( [
#weight1 = GetNthRecord ( all::weight ; 1 ) ;
#weight2 = GetNthRecord ( all::weight ; 2 )
] ; //end define Let
Case (
Abs ( #weight1 - weight ) > .1 ; "Unstable" ;
Abs ( #weight2 - weight ) > .1 ; "Unstable" ;
"Stable"
) //end Case
) //end Let
这有帮助吗?
答案 1 :(得分:0)
假设您正在使用FileMaker v12或更高版本,这看起来是使用ExecuteSQL函数(而不是脚本步骤)来检索最后两个值的好地方。你可以这样做:
Let (
sqlQuery = "
SELECT t.weight
FROM MyTable t
WHERE t.id <> ?
ORDER BY t.id DESC
FETCH FIRST 2 ROWS ONLY
" ;
ExecuteSQL ( sqlQuery ; "" ; "" ; MyTable::id )
)
此查询假设您有一个唯一的“id”字段(即主键),该字段被定义为“自动输入序列”值。 WHERE子句确保当前记录(可能是用户输入的记录)不包含在查询中。 ORDER BY DESC子句将最后两个记录强制到顶部,我们可以轻松地将“权重”值提取到值列表中。
假设您使用“设置变量”脚本步骤将查询结果放入$ lastValues,那么您可以测试它们是否在范围内,如下所示:
Let ( [
lastValue1 = GetValue ( $lastValues ; 1 ) ;
lastValue2 = GetValue ( $lastValues ; 2 ) ;
Value1_InRange = lastValue1 - Abs ( lastValue1 - weight ) >= ( 0.9 * lastValue1 ) ;
Value2_InRange = lastValue2 - Abs ( lastValue2 - weight ) >= ( 0.9 * lastValue2 )
] ;
Value1_InRange and Value2_InRange // returns 1 if both values within range, 0 if not
)
如果我这样做,我会将上述范围检查代码放入自定义函数中,因此它是通用的,可以很容易地重复使用:
IsWithinRange ( valueToTest ; lastValue ; range ) =
lastValue - Abs ( lastValue - valueToTest ) >= ( ( 1 - range ) * lastValue )
然后,上述范围检查代码可以简化为:
IsWithinRange ( MyTable::weight ; GetValue ( $lastValues ; 1 ) ; 0.1 ) &
IsWithinRange ( MyTable::weight ; GetValue ( $lastValues ; 2 ) ; 0.1 )
最后一点注意事项..如果在计算字段中使用ExecuteSQL函数,请确保将其“未存储”,以便仅在需要时执行。但是,我建议你完全避免这种情况,只需从像“设置变量”这样的脚本步骤中调用它。这样你就可以准确地控制它的执行时间。
希望有所帮助!