Импорт данных в Аксапте
Возможности импорта из текстового файла
Требования к текстовому файлу
Рекомендации и советы по импорту
Пример
Загрузить пример
Пример настройки импорта плана счетов
Распакуйте и загрузите с помощью стандартного механизма импорта. Главное меню \ Администрирование \ База данных \ Экспорт/Импорт \ Импорт.
В списке определений групп импорта у вас появится две строки. В этой статье приведен пример по строке План.
Импорт данных в Аксапте
Аксапта предоставляет стандартный механизм импорта из текстового файла. Найти детальное описание можно в хелпе в разделе Administrator's Guide \ Managing data \ Importing data from Other Systems.
Функция импорта доступна в Главном меню, раздел Администрирование \ База данных \ Экспорт/Импорт \ Группы определения. Каждая строка представляет свои правила и настройки импорта. Есть два вида импорта - из обычного текстового файла и из файла в собственном Аксаптовском формате.

Для того, чтобы импорт выполнялся из текстового файла, необходимо оставить галочку в поле Файл определений (Definition file) незаполненной. На картинке группы Адреса, Апольз, АСертиф, ГТД - это определение импорта из текстового файла.
Возможности импорта из текстового файла
- Возможно позиционное определение полей или определение с помощью разделителя;
- Импорт записывает информацию о каждой импортированной и неимпортированной записи в лог;
- Можно создать произвольные функции проверки, фильтрации и преобразования импортируемых данных на языке X++;
- Можно создать произвольные функции проверки и преобразования данных для каждого поля на языке X++;
- Непосредственно в определении импорта можно указать начальные значения для каждого поля;
- Для каждого поля можно указать символы к удалению, а также префикс и суффикс, которые будут удалены из текстовых данных перед записью в таблицу;
- Перед импортом можно автоматически удалить все записи, существующие в таблице;
- Можно указать поле, которое является идентификатором. В этом случае импорт будет не добавлять, а изменять записи.
Требования к текстовому файлу
- Каждый файл представляет одну таблицу;
- Каждая строка представляет одну запись;
- Если используется разделитель полей, то он должен быть одинаковым в одном файле;
- Если используется позиционное определение полей, то одно и то же поле во всех записях в файле должно начинаться и оканчиваться в одинаковой позиции.
Рекомендации и советы по импорту
Автор этих рекомендаций - Андрей Гершун. Андрей, спасибо за отличный совет.
Лучше не пользоваться кавычками, поскольку тогда возникает задача обработать двойные кавычки. Лучше использовать специальный символ для разделителя между полями. По совету Андрея Гершуна, я использую символ ~. Обычно этот символ не используется пользователями. Если он все же используется, то можно попробовать обратный апостроф ` или другой редко используемый символ.
Как правило, данные для импорта готовятся в Экселе. Текстовый файл лучше готовить самостоятельно. Укажите формулу, которая в одной и колонок готовит текст. А затем, перенесите через буфер обмена (clipboard) данные этой колонки в текстовый файл.
Стандартный экспорт в текстовый файл не дает нужной гибкости. Когда вы пишете формулу, то вы можете:
- явно указать колонки войдут в текстовый файл;
- изменить порядок этих колонок;
- и, самое главное, явно задать формат данных (формат чисел, формат даты, формат времени и т.п.);
- избежать неявного преобразования данных (например, код товара 005 должен остаться именно с нулями, а не превратиться в 5)
И еще один совет. Значения перечислимых типов лучше задавать не номером, а непосредственно текстом.
18.04.05, дополнение Hezl: Можно использовать и табуляцию в качестве разделителя. Откройте Notepad, вставьте символ табуляции в текст, скопируйте этот символ в буфер обмена, затем сделайте Paste в Аксаптовском поле Разделитель записей.
Пример
Например, мы хотим импортировать план счетов.
1.
Готовим данные в Экселе.
Обратите внимание на колонку M. В этой колонке указывается тип счета. Конечно, можно задавать код значения. Этот код можно узнать, посмотрев на перечисление LedgerAccountType. Однако гораздо удобнее указать текст. Если указываете текст, то импорт надо выполнять в том языке, на котором написана текстовая метка. В данном случае - на русском.
2.
Копируем колонку AQ с подготовленным текстом в буфер обмена (clipboard) и переносим в текстовый файл. Сделать это можно в Notepad, Word'е или в FAR'е. Текст должен быть в windows-кодировке. Записываем файл.

3.
Готовим параметры импорта. Создаем группу определения План, снимаем галочку с поля Определение файла. Нажимаем кнопку настройка таблиц. Создаем определение для таблицы LedgerTable. Указываем файл, из которого импортировать данные. Устанавливаем статус Удаление и импорт.
Внимание: после импорта статус изменяется. Если нужно повторить импорт, то надо снова изменить статус. Таким образом, можно настроить импорт нескольких таблиц, а импортировать только некоторые из них.
Записываем. Переходим на закладку разное и устанавливаем разделитель ~. Устанавливаем уникальное поле - AccountNum.
4.
Теперь определяем поля. Нажимаем на кнопку Настройка полей. Устанавливаем поля и их порядок в файле.
5.
Теперь случай сложнее. Попробуем настроить импорт настройки итоговых полей. Для итоговых полей надо указать диапазон, по которому производится суммирование. Диапазон указывается в таблице LedgerTableInterval.
Сложность состоит в том, что каждая запись в этой таблице может содержать настройку итога не только счетов плана счетов, но и настройку итоговых полей в других местах. Поле AccountTableId содержит идентификатор таблицы, для которой указан диапазон. Если мы вводим диапазон для счета плана счетов, то здесь должен быть код таблицы LedgerTable - 221.
Есть еще одна сложность. Нужно указать RecID той записи, для которой указан диапазон. Т.е. мы должны установить здесь RecID записей из плана счетов. Запоминать эти RecID в Экселевской таблице не стоит. Поскольку после каждого удаления и переимпорта RecID будут другими.
Кроме того, создавать отдельный файл не очень удобно. Было бы гораздо удобнее, если бы диапазон задавался на том же листе. Было бы удобнее, если диапазон не импортировался, если он не указан на листе Экселевской таблицы.
Попробуем это сделать. Для начала определим критерий импорта. На закладке Интервал у таблицы LedgerTableInterval запишем следующий алгоритм.
boolean import( LedgerTableInterval ledgerTableInterval, container inData ) { LedgerAccount accNum; accNum = conpeek(inData,1); if( !accNum ) return false; return LedgerTable::find(accNum).AccountPlType == LedgerAccountType::sum; }
Алгоритм возвращает true, когда импортируемую строку надо записывать в базу данных.
6.
Теперь перейдем к настройке полей
Сделаем, чтобы для каждой записи указывался код таблицы LedgerTable. Для этого для поля AccountTableId на закладке Параметры надо указать, что инициализацию надо проводить всегда и инициализировать это поле значением 221.
7.
Теперь осталось добавить алгоритм, который по коду счета будет находить RecID. Для этого для поля AccountRecID на закладке Исходные тексты программ надо добавить алгоритм
str convert(str input) { input = strfmt("%1", LedgerTable::find(input).RecID); return input; }
Алгоритм получает в качестве параметра строку до записи в таблицу. Алгоритм выполняет преобразование и возвращает новую строку, которая будет записана в данное поле.
Подробнее о импорте и его алгоритмах можно прочитать в хелпе.
Дополнение от 18.04.05
Будьте внимательны, когда устанавливаете Уникальное поле. Обязательно обрабатывайте поле, указанное уникальным (на закладке Настройка полей уникальное поле должно быть активным). Дело в том, что при импорте Аксапта ищет импортируемое в уникальное поле значение. Если находит запись с таким значением, то Аксапта не добавляет, а изменяет существующую запись. Если же вы поле, указанное как уникальное, не обрабатываете, то для всех импортируемых строк данное поле получает пустое значение. А следовательно, в этом случае Аксапта запишет все импортируемые строки в одну запись. |
Буду рад Вашим замечаниям и предложениям.
mazzy@mazzy.ru, Мазуркин Сергей













