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, ключами которой будут названия полей исходной таблицы, а значениями - названия полей целевой таблицы.
Тогда можно будет избавиться от ограничения на идентичность названия полей, их количество и т.д. Прошу прощения, что пишу только идею, а не код - просто сейчас не много времени. После выходных, если кому-то будет интересно, могу выложить код. Хотя, по моему, исправлений вышенаписанного кода будет не много. |
|