gl00mie, спасибо, что развиваете тему в "обратном направлении", т.е. Axapta <= Excel.
В очередной раз подумал, не пора ли затевать аналогичный "коллективный эксперимент"...
По классу - пара пожеланий.
Код:
itemId = excelImp.getFieldValue(0);
itemName = excelImp.getNamedFieldValue('Название');
price = excelImp.getFieldValue(2, false);
Первое. Я бы объединил методы getFieldValue и getNamedFieldValue в один универсальный getFieldValue. И плюс к этому нумерацию полей начал бы с единицы, невзирая на то, что в самом ADO первое поле - 0. Понимаю, что вопрос концептуально-идеологический. Я сам метался между 0 и 1, но в конце концов остановился на 1. Ну и что, что лишняя операция вычитания, зато получается нормальный наглядный натуральный ряд (блин, ненавижу циклы от 0 до Count-1).
У меня в "инструментальном ящичке" в некотором классе есть противоположный метод - setFieldValue, привожу его в качестве подспорья-иллюстрации. Воспользуйтесь при желании.
Код:
void setFieldValue(anytype _fldName, anytype _fldValue, int _ordNum = 0)
{
// _fldName - можно текстовое имя, а можно числовое, начиная с 1 (!), а не 0 как в самом ADO
// _ordNum - дополнительный способ нумерации, если используются текстовые названия полей (чисто для наглядности самого кода)
anytype fldName;
if (typeof(_fldName) == Types::Integer)
{
fldName = _fldName - 1;
}
else
{
fldName = _fldName; // текстовое представление поля
}
fld = flds.Item(fldName);
fld.Value(_fldValue);
}
Второе пожелание. В методе getRecordCount я бы не торопился возвращать -1 в случае невозможности определения кол-ва записей через ADO. Всё же класс посвящен Excel'ю, а он нам не чужой. Можно, например, воспользоваться в Excel методом Range.CurrentRegion и далее Rows.Count минус первая заголовочная строка (если она есть). Ну, как-то так...
Ну, и еще раз спасибо!