|  12.07.2006, 13:09 | #1 | 
| Участник | создать и передать временную таблицу 
			
			Есть класс, в одном из методов формируется запрос по одной из существующих таблиц. Нужно,  результаты этого запроса  пометить во временную таблицу с такой же структурой.что и сущ таблица + еще 2 поля. Как это сделать не забивая заново все поля? setTmp не подходит, тк структура разная немного. SetTmpData  PHP код: 
			Более того, эту получившуюся временную таблицу хотелось бы потом передать в другой класс на обработку, где помимо всего прочего будет производиться вставка доп записей. Достаточно ли будет в новом классе получить через getMyTmpTable текущего класса курсор на врем таблицу, проинициализировать табл переменную с пом SetTmpData и дальше с ней уже производить все манипуляции. Спасибо | 
|  | 
|  12.07.2006, 13:55 | #2 | 
| Участник | 
			
			А чем плох способ забивания заново всех полей? Просто создайте метод на этой таблице, что-нить вида: initFromMyTable(MyTable _rec); А в нем один раз уж придется прописать заполнение всех полей. Зато потом сможете использовать и не только здесь. Да, если передать ссылку на этот объект в другой класс, то можно будет дальше работать с этими данными, добавляя записи, к примеру. | 
|  | 
|  12.07.2006, 14:03 | #3 | 
| Участник | 
			
			используйте SysDictTable и присваивайте поля по имени
		 | 
|  | 
|  12.07.2006, 14:48 | #4 | 
| NavAx | Цитата: 
		
			Сообщение от kitty
			
			 Есть класс, в одном из методов формируется запрос по одной из существующих таблиц. Нужно,  результаты этого запроса  пометить во временную таблицу с такой же структурой.что и сущ таблица + еще 2 поля. 
				__________________ Isn't it nice when things just work? | 
|  | 
|  12.07.2006, 15:33 | #5 | 
| Участник | 
			
			Вот набрасал пример джоба, который заполняет таблицу (можно и темповую, неважно), в таблице есть метод, который пишет данные в неё по полученной записи,  единственно нужно добавить анализ по полям типа modifiedBY,TableId и т.п., а так все работает : X++: static void TestJob(Args _args) { TmpTest tmpTest; InventTable inventTable; ; while select * from inventTable { tmpTest.setTmpData(tmpTest.makeRecord("InventTable","TmpTest" ,inventTable,tmpTest)); if (tmpTest.RecId != 0) tmpTest.insert(); } while select * from tmpTest { info(tmpTest.ItemId + tmpTest.ItemName); } } X++: Common makeRecord(str _fromTable, str _toTable, Common _fromCommon, Common _toCommon) { DictTable dictTable1 = new DictTable(tablename2Id(_toTable)); DictTable dictTable2 = new DictTable(tablename2Id(_fromTable)); int i; int t2FieldId; str t1FieldId; ; for (i = 1;i <= dictTable2.fieldCnt();i++) { t1FieldId = dictTable2.fieldName(dictTable2.fieldCnt2Id(i)); if (!dictTable1.fieldName2Id(t1FieldId)) continue; t2FieldId = dictTable2.fieldCnt2Id(i); _toCommon. (dictTable1.fieldName2Id(t1FieldId)) = _fromCommon. (t2FieldId); } if (_toCommon.RecId != 0) return _toCommon;//.insert(); else return null; } | 
|  | 
|  12.07.2006, 16:54 | #6 | 
| Участник | 
			
			Еще бы оформить это как функцию класса global и можно переносить в прокты   PS Вещь реально нужная, поскольку buf2buf работает как раз по id что не всегда удобно | 
|  | 
|  12.07.2006, 17:19 | #7 | 
| Участник | 
			
			вот доработанный код метода, можно ставить в Global :  X++: container table2table(str _fromTable, str _toTable, Common _fromCommon, Common _toCommon) { DictTable dictTable1 = new DictTable(tablename2Id(_toTable)); DictTable dictTable2 = new DictTable(tablename2Id(_fromTable)); int i, ret; int t2FieldId; str t1FieldId; ; ret = 0; for (i = 1;i <= dictTable2.fieldCnt();i++) { t1FieldId = dictTable2.fieldName(dictTable2.fieldCnt2Id(i)); t2FieldId = dictTable2.fieldCnt2Id(i); if (!dictTable1.fieldName2Id(t1FieldId)) continue; else if (isSysId(t2FieldId)) continue; _toCommon. (dictTable1.fieldName2Id(t1FieldId)) = _fromCommon. (t2FieldId); ret++; } if (ret) return [_toCommon,ret]; else return [null,ret]; } | 
|  | 
|  12.07.2006, 17:26 | #8 | 
| Участник | 
			
			Хотя можно возвращать не контейнер, а Common, кому как нравится :-)
		 | 
|  | 
|  12.07.2006, 17:34 | #9 | 
| Участник | 
			
			а если переделать начало и не передавать параметры "str _fromTable, str _toTable,"? DictTable dictTable1 = new DictTable(_toCommon.TableId); DictTable dictTable2 = new DictTable(_fromCommon.TableId); | 
|  | 
|  12.07.2006, 17:50 | #10 | 
| Участник | 
			
			да конечно, так будет даже компактней :-)
		 | 
|  | 
|  13.07.2006, 14:20 | #11 | 
| NavAx | 
			
			Решил развлечься малость. Вот метод, который копирует не одну строку, а всю таблицу. Может кому сгодится. P.S. Работает весьма быстро   PHP код: 
			
				__________________ Isn't it nice when things just work? Последний раз редактировалось macklakov; 13.07.2006 в 14:22. | 
|  | |
| За это сообщение автора поблагодарили: George Nordic (2). | |
|  13.07.2006, 14:40 | #12 | 
| Moderator | 
			
			Кстати, метод можно сделать более универсальным, передавая необязательный параметр - Map, ключами которой будут названия полей исходной таблицы, а значениями - названия полей целевой таблицы. Тогда можно будет избавиться от ограничения на идентичность названия полей, их количество и т.д. Прошу прощения, что пишу только идею, а не код - просто сейчас не много времени. После выходных, если кому-то будет интересно, могу выложить код. Хотя, по моему, исправлений вышенаписанного кода будет не много. | 
|  |