我们继承了一个包含500多个字段的表,几乎所有字段都已建立索引。我们正在尝试通过ODBC访问该表,但是由于索引数量巨大,因此无法进行。
我们正在寻求有关如何迭代所有字段的帮助,请查看它是否已被索引,如果已索引则将其删除。
我们已经迷迷糊糊了好几个小时,并且没有取得任何进展,所以希望有人能提供帮助!
我们欢迎有帮助的插件或其他解决方案,或者只是一些有关如何通过FileMaker Pro脚本进行操作的建议。
提前谢谢!
本
PS我们正在使用Windows的FileMaker Pro 17,这是我们尝试的方法: 我们试图将Execute SQL与DROP INDEX函数一起使用,但是似乎每个字段都需要它,并且每个字段都需要一个新的Exectute SQL语句,这意味着有500多个语句。这也是一个问题,因为并非所有字段都具有索引,因此没有引发错误的字段似乎会停止脚本运行。
更新:感谢@AndreasT,我能够使它正常工作!我已经把关键的项目加粗了。
STEPS 1.使用所需字段创建一个视图 2.编写脚本(见下文)以获取字段的变量 3.遍历字段集,使用计算的SQL删除字段
容易撒尿!再次感谢@AndreasT!你是一个金色的神!
Set Error Capture [ On ]
Set Variable [ $fieldlist; Value:FieldNames ( Get(FileName); “__BENTEST”) ]
Set Variable [ $fieldcount; Value:ValueCount($fieldlist) ]
Loop
Set Variable [ $counter; Value:$counter + 1 ]
Set Variable [ $fieldname; Value:GetValue($fieldlist;$counter) ]
Execute SQL [ ODBC Data Source: “FM_Constituents”; Calculated SQL Text: “DROP INDEX on Constituents.” & $fieldname ]
[ No dialog ]
Exit Loop If [ $counter = $fieldcount ]
End Loop
答案 0 :(得分:1)
脚本引擎或计算引擎中没有影响数据库架构的功能。但是,将数据库用作ODBC源时,可以从字段创建或删除索引。您可以获取列(字段)名称的列表,并对其进行迭代并在每个字段上执行DROP INDEX语句。
本文档第22页的更多信息:FileMaker 16 SQL Reference
编辑:您也可以尝试使用插件,并在循环脚本中的计算中运行它。这似乎支持DROP Index语句。 myFMBUTLER DoSQL plugin
可能还有其他插件也可以做到这一点。
编辑2: 这样的事情应该可以解决问题,但是由于索引过多而无法通过ODBC访问文件的根本问题似乎很奇怪,应该进行调查。该文件可能已损坏,您可以尝试进行恢复并在恢复的版本上进行测试。
这是循环脚本的原理。
创建一个新的布局,并将所有需要的字段添加到其中。从“字段选择器”中拖放是一种简单的方法。您可以按字段类型排序,并且仅在需要时才拖动文本和数字字段。
In your script, Set error capture to On.
Set a varible $fieldlist to FieldNames ( Get(FileName );"Your new layout name").
Now you have your list of fields/columns.
Set a $fieldcount variable to count the fields ValueCount($fieldlist)
Set a $counter variable to 1
Start a loop
Get the first column name by setting a variable to GetValue($fieldlist;$counter)
Do the SQL to DROP INDEX on this column
Increment the $counter
Exit loop when $counter > $fieldcount
End loop
Sam在评论中说的是正确的,因此请在相关布局上禁用Quickfind,否则您可能会对该布局上的任何可索引字段重新获得索引。他是对的,没有办法以编程方式阻止创建新索引,而必须手动完成。