使用脚本在 filmemaker 中进行复杂搜索((A 或 B)和(C 或 D 或 E))

Complex search in filmemaker using scripts ( (A or B) and (C or D or E) )

我有一个 filemaker 数据库,我想根据以下条件显示记录:

显示所有者或用户为 "John" 且地点为 "London"、"Paris" 或 "Amsterdam"

的所有记录

第一部分很简单:

Enter Find Mode [Pause:Off]
Set Field [mydb::Owner; "John"]
New Record/Request
Set Field [mydb::User"; "John"]
Perform Find[]

但是第二部分呢?到目前为止,我还没有能够实现这一点。我当然可以继续循环遍历找到的记录并忽略我不想要的记录,但应该有更好的方法来做到这一点。

有。您可以在执行初始查找后使用约束搜索结果。

Enter Find Mode [Pause:Off]
Set Field [mydb::Owner; "John"]
New Record/Request
Set Field [mydb::User"; "John"]
Perform Find[]
#Constrain the found set
Enter Find Mode [Pause:Off]
Set Field [mydb::Place; "London"]
New Record/Request
Set Field [mydb::Place; "Paris"]
New Record/Request
Set Field [mydb::Place; "Amsterdam"]
Constrain Found Set [] 

创建 FileMaker 搜索的一种直接方法是在列表中重新表述您的 search-requirements,如下所示:

(O and L)
or
(O and P)
or
(O and A)
or
(U and L)
or
(U and P)
or
(U and A)
but not
(B and C)

换句话说:

  1. 对于您想查找的每个案例,您在一行中写下由'and' 分隔的条件。您可以添加括号,这是可选的,但它们确实可以更轻松地正确阅读和理解逻辑
  2. 然后用 'or'
  3. 分隔每一行
  4. 如果您有想要从结果中 排除 的情况,您可以写 'but not' 而不是 'or',并且 - 非常重要的 - 你添加列表末尾的排除项!

在你的例子中,你可以这样写:

(Owner="John" and Place="London")
or
(Owner="John" and Place="Paris")
or
(Owner="John" and Place="Amsterdam")
or
(User="John" and Place="London")
or
(User="John" and Place="Paris")
or
(User="John" and Place="Amsterdam")

当你写下这些后,你所要做的就是:

  1. 用等效的设置字段步骤替换每个条件(否则忽略 'and's)
  2. 用新的 Record/Request 步骤替换 'or'
  3. 将'but not'替换为新建Record/Request两步,省略记录
  4. 将所有这些置于进入查找模式[暂停:关闭]/执行查找[] 三明治,然后您就可以运行!

示例代码如下所示:

Enter Find Mode [Pause:Off]
Set Field [mydb::Owner ; "John"]
Set Field [mydb::Place ; "London"]
New Record/Request
Set Field [mydb::Owner ; "John"]
Set Field [mydb::Place ; "Paris"]
New Record/Request
Set Field [mydb::Owner ; "John"]
Set Field [mydb::Place ; "Amsterdam"]
New Record/Request
Set Field [mydb::User ; "John"]
Set Field [mydb::Place ; "London"]
New Record/Request
Set Field [mydb::User ; "John"]
Set Field [mydb::Place ; "Paris"]
New Record/Request
Set Field [mydb::User ; "John"]
Set Field [mydb::Place ; "Amsterdam"]
Perform Find[]

你用这个multiple-request方法还是AndreasT的constrain方法是性能问题,你得到的组合数量。

为了完整起见,这里有一个 'but not' 的示例 - 以英国脱欧为主题:

假设您想在欧洲大陆寻找 FileMaker 程序员,您可能有以下条件:

(Job="FileMaker" and Place="Europe")
but not
(Land="UK")

使用上面的方法,这将被实现为:

Enter Find Mode [Pause:Off]
Set Field [mydb::Job ; "FileMaker"]
Set Field [mydb::Place ; "Europe"]
New Record/Request
Omit Record
Set Field [mydb::Land ; "UK]
Perform Find[]

快乐的 FileMaking!

沃森先生