FileMaker计算中的多个AND语句

时间:2017-05-08 18:54:46

标签: filemaker

我想计算一个值是否超出添加到数据库的最后两个值的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")

2 个答案:

答案 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函数,请确保将其“未存储”,以便仅在需要时执行。但是,我建议你完全避免这种情况,只需从像“设置变量”这样的脚本步骤中调用它。这样你就可以准确地控制它的执行时间。

希望有所帮助!