Удалите все индексы в таблице FileMaker Pro - PullRequest
1 голос
/ 22 апреля 2019

Мы унаследовали таблицу с более чем 500 полями, и почти все из них проиндексированы.Мы пытаемся получить доступ к этой таблице через ODBC, но не можем из-за огромного количества индексов.

Мы ищем справку о том, как перебрать все поля, посмотреть, проиндексировано ли это, и удалить индекс, если оно есть..

Мы часами спотыкаемся и не делаем никакого прогресса, поэтому надеемся, что кто-то может помочь!

Мы открыты для плагинов или других решений, которые могут помочь, или просто для некоторых советов о том, каксделать это с помощью сценариев FileMaker Pro.

Заранее спасибо!

Бен

PS Мы на FileMaker Pro 17 для Windows Вот что мы пробовали: Мы пыталисьиспользуйте команду «Выполнить SQL» с функцией DROP INDEX, но, как представляется, она необходима для каждого поля, и для каждого поля требуется новый оператор Exectute SQL, что означает более 500 операторов.Это также проблема, потому что не все поля имеют индекс, поэтому те, которые не выдают ошибку, которая, кажется, останавливает выполнение скрипта.

ОБНОВЛЕНИЕ: Благодаря @AndreasTЯ смог заставить это работать!Я выделил элементы, которые были ключом.

ШАГИ 1. Создайте представление с полями, которые я хотел 2. Напишите скрипт (см. Ниже), чтобы получить переменную поля 3Зацикливать набор полей, отбрасывая поле с помощью Calculated SQL

Easy peezy!Еще раз спасибо, @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

1 Ответ

1 голос
/ 22 апреля 2019

В обработчике сценариев или вычислителе нет функций, влияющих на схему базы данных. Однако вы можете создать или удалить индекс из поля при использовании базы данных в качестве источника ODBC. Вы можете получить список имен столбцов (полей) и выполнить итерации по ним, выполнив инструкцию DROP INDEX для каждого поля.

Подробнее на стр. 22 этого документа: Справочник по FileMaker 16 SQL

РЕДАКТИРОВАТЬ: Вы также можете попробовать использовать плагин и запустить его из расчета в цикле сценария. Этот, кажется, поддерживает заявление индекса DROP. Плагин myFMBUTLER DoSQL

Могут быть и другие плагины, которые тоже будут это делать.

РЕДАКТИРОВАТЬ 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

То, что Сэм говорит в комментариях, является правдой, поэтому отключите Quickfind для соответствующих макетов, или вы, вероятно, вернете свои индексы для любого индексируемого поля в этом макете. И он прав, что нет способа предотвратить создание новых индексов программно, это нужно делать вручную.

...