Для работы с внешними файлами базы данных AMPL использует обработчики таблиц. Это аддоны, обычно в форме разделяемых или динамически подключаемых библиотек, которые могут быть загружены по мере необходимости.
AMPL распространяется со «стандартными» обработчиками таблиц, который работает под управлением Microsoft Windows и взаимодействует через интерфейс прикладного программирования Open Database Connectivity (ODBC) и xlsx. Они распознают реляционные таблицы в форматах, используемых Access, Excel и любым другим приложением, для которого на компьютере существует драйвер ODBC. Дополнительные обработчики могут поставляться поставщиками AMPL или программного обеспечения базы данных.
В дополнение к любым поставляемым обработчикам в AMPL встроены минимальные обработчики файлов ASCII и бинарных реляционных таблиц для тестирования. Поставщики могут включать другие встроенные обработчики.
Использование стандартного обработчика таблиц ODBC
Общая форма записи для стандартного обработчика таблицы ODBC выглядит следующим образом:
"ODBC" "connection-spec" "external-table-spec"opt "verbose"opt
Первый параметр записи сообщает AMPL, что при передаче данных с использованием этого объявления таблицы должен использоваться стандартный обработчик ODBC. Последующие строки предоставляют указания для обработчика ODBC.
Второй параметр записи идентифицирует внешний файл базы данных, который должен быть прочитан или записан при выполнении команд read table table-name или write table table-name. Имеется несколько вариантов указания 2-й параметра записи, в зависимости от формы спецификации соединения и конфигурации ODBC на вашем компьютере.( Информация о конфигурации вашего компьютера драйверов ODBC, имен источников данных, источников данных файлов и связанных сущностей можно просмотреть и изменить с помощью панели управления ODBC Windows.)
- Если спецификацией соединения является имя файла в формате name.ext, где ext - это трехбуквенное расширение, связанное с установленным драйвером ODBC, то указанный файл является файлом базы данных. Эту форму можно увидеть в ряде наших примеров, где файлы с именами name.mdb и name.xls относятся к файлам Access и Excel, соответственно.
- Другие формы объявления соединения более специфичны и описаны в других разделах документации.
Третий параметр обычно дает имя реляционной таблицы в указанном ранее (2-ым параметром) файле, которая должна быть прочитана или записана при выполнении команд read table или write table. Если третий параметр опущен, имя реляционной таблицы считается идентичным имени файла содержащего таблицу. При записи данных, если указанная таблица не существует, она создается; если таблица существует, и все спецификации данных объявления таблицы имеют статус чтения/записи OUT, тогда она перезаписывается. В противном случае запись данных приводит к изменению существующей таблицы; каждый записанный столбец либо перезаписывает существующий столбец с тем же именем, либо становится новым столбцом, добавляемым в таблицу.
sql-запросы
В качестве альтернативы, если третий параметр имеет специальную форму SQL=sql-query объявление таблицы применяется к реляционной таблице, которая (временно) создается оператором SQL= "" на языке структурированных запросов, обычно сокращенно SQL. В частности, реляционная таблица сначала создается путем выполнения оператора SQL, заданного sql-запросом, относительно файла базы данных, заданного вторым параметром.
Затем обычные интерпретации объявления таблицы применяются к созданной таблице. Все столбцы, указанные в объявлении, должны иметь статус чтения/записи IN, так как не имеет смысла записывать данные во временную таблицу. Обычно sql-запрос - это оператор SELECT, который является основным оператором SQL.
Например, если необходимо прочитать в качестве данных для diet.mod только те продукты, стоимость которых не превышает 2,49 долл. США, можно использовать запрос SQL для извлечения соответствующих записей из таблицы Foods базы данных:
table cheapFoods IN "ODBC" "diet.mdb" "SQL=SELECT * FROM Foods WHERE cost <= 2.49": FOOD <- [FOOD], cost, f_min, f_max;
Затем, чтобы прочитать соответствующие данные для параметра amt, который индексируется по питательным веществам (NUTR) и продуктам питания (FOOD), нужно прочитать только те записи, которые относятся к продукту, стоимость которого составляет 2,49 долл. США или меньше. Вот один из способов использования SQL-запрос для извлечения нужных записей:
option selectAmts "SELECT NUTR, Amts.FOOD, amt" "FROM Amts, Foods" "WHERE Amts.FOOD = Foods.FOOD and cost <= 2.49"; table cheapAmts IN "ODBC" "diet.mdb" ("SQL=" & $selectAmts): [NUTR, FOOD], amt;
В примере выше мы использовали запись AMPL для хранения строки (option selectAmts...), содержащей запрос SQL. Тогда третий параметр может быть описан относительно коротким строковым выражением «SQL =» & $selectAmts.
Параметр verbose после первых трех параметров запрашивает диагностические сообщения - например, строку DSN =, которую использует отчет ODBC - всякий раз, когда содержащее объявление таблицы используется командой чтения таблицы или записи таблицы.
Использование стандартного обработчика таблиц ODBC с Access и Excel
Чтобы настроить соответствие реляционной таблицы для чтения или записи файлов Microsoft Access, укажите ext во второй строке списка строк как mdb:
"ODBC" "filename.mdb" "external-table-spec"opt
Файл, названный объявленный вторым параметром, должен существовать. При записи это может быть база данных, которая еще не содержит таблиц.
Чтобы настроить соответствие реляционной таблицы для чтения или записи электронной таблицы Microsoft Excel, необходимо указать ext во второй записи как xls:
"ODBC" "filename.xls" "external-table-spec"opt
В этом случае второй параметр определяет имя внешнего файла Excel, который должен быть записан. Если файл не существует - он создается.
external-table-spec заданная третьим параметром, определяет диапазон электронной таблицы в указанном файле, который должен быть прочитан или записан. Если эта строка отсутствует, имя диапазона принимается из table-name, указанным в начале объявления table. Для чтения указанный диапазон должен существовать в файле Excel. При записи, если диапазон не существует, он создается в левом верхнем углу нового листа с тем же именем. Если диапазон существует, но все data-specs объявления таблицы имеют статус чтения/записи OUT, он перезаписывается. В противном случае запись приводит к изменению существующего диапазона. Каждый столбец при записи либо перезаписывается или становится новым столбцом, добавляемым в таблицу. Каждая записанная строка либо перезаписывает записи в существующей строке, имеющей те же ключевые записи столбца, либо становится новой строкой, добавляемой в таблицу.
Когда запись приводит к расширению существующего диапазона, строки или столбцы добавляются в нижней или правой части диапазона соответственно. Ячейки добавленных строк или столбцов должны быть пустыми. В противном случае попытка записи таблицы не удастся, и команда записи таблицы выдаст сообщение об ошибке. После того, как таблица успешно записана, соответствующий диапазон создается или корректируется, чтобы в точности содержать ячейки этой таблицы.
Встроенные обработчики таблиц для текстовых и двоичных файлов
В целях отладки и демонстрации AMPL имеет встроенные обработчики для двух очень простых форматов реляционных таблиц. Эти форматы хранят одну таблицу на файл и передают эквивалентную информацию. Один создает файлы ASCII, которые можно просмотреть в любом текстовом редакторе, а другой создает двоичные файлы, которые намного быстрее считываются и записываются.
filename.tab
Для этих обработчиков строковый список объявления таблицы содержит не более одной строки, идентифицирующей внешний файл, который содержит реляционную таблицу. Если строка имеет вид:
filename.tab файл считается текстовым файлом ASCII; если оно имеет форму filename.bit это бинарный файл. Если список строк не указан, подразумевается текстовый файл table-name.tab.
Для чтения указанный файл должен существовать. Для записи, если файл не существует, он создается. Если файл существует, но все спецификации данных объявления таблицы имеют статус чтения / записи OUT, он перезаписывается. В противном случае запись приводит к изменению существующего файла. Каждый записанный столбец либо заменяет существующий столбец с тем же именем, либо становится новым столбцом, добавленным в таблицу.
Формат текстовых файлов можно проверить, написав один и просмотрев результаты в текстовом редакторе. Например, следующий сеанс AMPL,
model diet.mod; data diet2a.dat; solve; MINOS 5.5: optimal solution found. 13 iterations, objective 118.0594032 table ResultList OUT "DietOpt.tab": [FOOD], Buy, Buy.rc, {j in FOOD} Buy[j]/f_max[j]; write table ResultList; создает файл DietOpt.tab со следующим содержимым: ampl.tab 1 3 FOOD Buy Buy.rc ’Buy[j]/f_max[j]’ BEEF 5.360613810741701 8.881784197001252e-16 0.5360613810741701 CHK 2 1.1888405797101402 0.2 FISH 2 1.1444075021312856 0.2 HAM 10 -0.30265132139812223 1 MCH 10 -0.5511508951406658 1 MTL 10 -1.3289002557544745 1 SPG 9.306052855924973 -8.881784197001252e-16 0.9306052855924973 TUR 1.9999999999999998 2.7316197783461176 0.19999999999999998
В первой строке amp.tab идентифицирует его как текстовый файл реляционной таблицы AMPL, и за ним следуют номера ключевых и не ключевых столбцов соответственно. Во второй строке приведены имена столбцов таблицы, которые могут быть любыми строками. (Использование оператора «~» для указания допустимых имен столбцов в этом случае не требуется.) Каждая последующая строка дает значения в одной строке таблицы. Числа пишутся с полной точностью, без специального форматирования или выравнивания.