04.07.2008, 14:40 | #1 |
Участник
|
Как добавить значение в таблицу не по имени поля, а нпример по индексу поля?
Нарпимер есть следущее:
X++: Dimensions dimensions; ; // обычный способ с явным указанием поля // dimensions.Num = "text1"; // а хотелось бы так: // dimensions.indexOfField(1) = "some text"; dimensions.insert(); |
|
04.07.2008, 14:49 | #2 |
Участник
|
X++: dimensions.(FieldNum(Dimensions, Num)) = "some text"; |
|
04.07.2008, 14:57 | #3 |
Участник
|
Спасибо. Но дело как раз в том что я не хочу явно указывать имя поля Num, моя переменная называется Column и принимает значения от 0 до кол-ва столбцов. Если я пишу
dimensions.(FieldNum(Dimensions, Column)) = "some text"; то возникает ошибка "Таблица не содержит это поле" |
|
04.07.2008, 15:04 | #4 |
Участник
|
По номеру поля в порядке его расположения в таблице Вы не обратитесь к нему. Обращаться можно по идентификатору. Предлагаю Вам переменную Column заполнять значением fieldNum.
|
|
04.07.2008, 15:09 | #5 |
----------------
|
Через dictTable, наверно, можно вытащить fieldId по порядковому номеру.
Но идея какая-то странноватая... может расскажите, зачем оно вам понадобилось? |
|
04.07.2008, 15:29 | #6 |
Участник
|
Цитата:
X++: dimensions.([COLOR=blue]FieldNum[/COLOR](Dimensions, "field_" + int2str(Column))) = [COLOR=red]"some text"[/COLOR] |
|
04.07.2008, 15:30 | #7 |
Участник
|
В цикле перебирать поля и заполнять их нужными значениями.
|
|
04.07.2008, 15:41 | #8 |
Участник
|
Попробуйте через DictTable.fieldCnt2Id(int _cnt) получить id поля.
|
|
04.07.2008, 15:42 | #9 |
Участник
|
|
|
04.07.2008, 15:50 | #10 |
Axapta
|
yuriuss, я думаю вы неправильно ставите задачу. Еще раз, зачем вам это надо? Какую задачу вы решаете? В аксапте нет такого понятия, как "порядковый номер поля". Для этих целей есть fieldId. Перебирать поля можно по ним.
У филдНама второй аргумент - не стринг. |
|
04.07.2008, 23:53 | #12 |
Axapta
|
А я бы не спешил давать такой совет, так как он может оказаться вредным. Я бы сначала попробовал понять, какую задачу решаем-то?
|
|
07.07.2008, 15:42 | #13 |
Участник
|
Задача такая. Делаем импорт таблицы из одной базы в другую через ADO. Сразу скажу что надо сделать таким способом, без использования репликаций и стандартного импорт/экспорта. В принимающей базе создаётся конекшн, далее формируется Recordset в цикле обрабатываются строки где я знаю какие есть имена исходной таблицы. Чтобы не писать эквивалент полей в принимающей таблицы и исходной можно создать цикл где будут заполняться строки принимающей таблицы, примерно так:
X++: while (!adoRecordSet.EOF()) { for (col=0; col<=(adoFields.count()-1); col++) { adoField = adoFields.itemIdx( col ); fieldName = adoField.name(); value = adoField.value(); // ниже строчка какбы хотелось реализовать dimensions.(FieldNum(Dimensions, col)) = value; } dimensions.insert(); adoRecordSet.moveNext(); } Последний раз редактировалось yuriuss; 07.07.2008 в 15:44. |
|
07.07.2008, 16:04 | #14 |
Участник
|
Когда Вы делаете экспорт таблицы добавте в recordset еще одно поле fieldId, в которое помещайте fieldNum. А при импорте обращайтесь к этому полю. Так будет проще всего. Хотя, как здесь уже писали можно и через dictTable.
|
|
07.07.2008, 16:07 | #15 |
Участник
|
а почему Вам не использовать имена полей как советовал gl00mie?
X++: hile (!adoRecordSet.EOF()) { for (col=0; col<=(adoFields.count()-1); col++) { adoField = adoFields.itemIdx( col ); fieldName = adoField.name(); value = adoField.value(); // ниже строчка какбы хотелось реализовать dimensions.(FieldName2id(tablenum(Dimensions), fieldName)) = value; } dimensions.insert(); adoRecordSet.moveNext(); }
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
07.07.2008, 16:26 | #16 |
Участник
|
Возникает ошибка на строке
X++: dimensions.(FieldName2id([COLOR=blue]tablenum[/COLOR](Dimensions), fieldName)) = value; Цитата:
Ошиба времени выполнения. Неправильные типы аргументов в операции присвоения значения переменной.
|
|
07.07.2008, 16:36 | #17 |
Участник
|
объявите value как anytype. А получайте значение примерно следующим образом
value = this.getValue(adoField.value()); Где X++: anytype getValue(COMVariant _value) { anytype v; switch(_value.variantType()) { case COMVariantType::VT_BOOL: v = _value.boolean(); break; case COMVariantType::VT_BSTR: v = _value.bStr(); break; case COMVariantType::VT_INT: v = _value.int(); break; case COMVariantType::VT_DATE: v = _value.date(); break; case COMVariantType::VT_DISPATCH: v = COM::createFromVariant(_value); break; case COMVariantType::VT_I4: v = _value.int(); break; case COMVariantType::VT_R8: v = _value.double(); break; default: throw Error(strfmt("Неизвестный тип данных: %1", _value.variantType())); } return v; } } Последний раз редактировалось _scorp_; 07.07.2008 в 16:50. |
|