|  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. | 
|  |