20.07.2009, 13:34 | #1 |
Участник
|
Синхронизация полей в мапе. Как бы сделать?
Все доброго времени суток.
Появился такой вопрос, может кто подскажет. Задача стоит в синхронизации полей в связных таблицах мапах типа Клиент-Поставщик. Те нужно чтобы все поля обновлялись при обновлении в связной. Понимаю, что как-то можно через мап их сопоставить, чтобы выйти на поля другой таблицы, только вот как??? Пока научился искать поля по названию, но это не правильно. Кто-нить сможет подсказать как в коде сопоставлять поля в мапе? Или может есть какой-то другой способ синхронизации полей "мапных" таблиц? |
|
20.07.2009, 14:28 | #2 |
Ищущий знания...
|
что-то я не совсем понял в чем проблема..
у Вас не появляется поле в Map-е? или что?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
20.07.2009, 14:41 | #3 |
Участник
|
Проблема в том, что я не могу в коде найти соответствия маповых полей. Те например зная fieldId клиентского поля, найти fieldId поля поставщика, сопоставленного по маппингу.
Если еще подробнее, то поле CustTable.CustGroup сопоставлено с полем CustVendTable.GroupId и VendTable.VendGroup сопоставлено с полем CustVendTable.GroupId. так вот как имея CustGroup перейти к VendGroup через мап в коде.. Надеюсь более понятно описал |
|
20.07.2009, 14:49 | #4 |
Ищущий знания...
|
Цитата:
Сообщение от Kashesh
Проблема в том, что я не могу в коде найти соответствия маповых полей. Те например зная fieldId клиентского поля, найти fieldId поля поставщика, сопоставленного по маппингу.
Если еще подробнее, то поле CustTable.CustGroup сопоставлено с полем CustVendTable.GroupId и VendTable.VendGroup сопоставлено с полем CustVendTable.GroupId. так вот как имея CustGroup перейти к VendGroup через мап в коде.. Надеюсь более понятно описал Мэп нужен для того, что бы можно было проинициализировать любую таблицу входящую в него не испытываю проблем для дальнейшего использования его в коде (например CustVendTable = custTable - CustVendTable примет "вид" CustTable, и так же для VendTable) но на сколько мне известно, сопоставить номера полей через мэп нельзя (если я не прав меня поправят) код поля можно получиться например вот так: X++: fieldId = fieldNum(VendTable, VendGroup)
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
20.07.2009, 14:56 | #5 |
Участник
|
Когда обновляется поле в клиенте, мне нужно знать какое поле обновить в поставщике. Так стоит задача синхронизации полей клиент-поставщик. Можно конечно в коде сопоставить все поля клиент-поставщик (cust.aaa = vend.aaa), но это слишком муторно, громоздко, да и куча мест где это надо будет сделать.
Может конечно можно и без таких наворотов, может как-то по-другому, я не знаю просто |
|
20.07.2009, 15:12 | #6 |
Участник
|
Так и обновляйте через мап
X++: CustVendTable _vendTable; CustVendTable _custTable; ; _vendTable = vendTable; _custTable = custTable; _vendTable.GroupId = _custTable.GroupId;
__________________
Axapta v.3.0 sp5 kr2 |
|
20.07.2009, 15:34 | #7 |
Участник
|
Да я знаю, что можно вручную в коде сопоставить все поля и все. Но я хочу сделать универсально, вдруг добавятся еще поля и тд.. те получив на входе fieldId custTable, на выходе иметь fieldId vendTable
|
|
20.07.2009, 15:52 | #8 |
Участник
|
Заведите свой собственный мап, в котором будут перечислены поля для синхронизации и сделайте что-то типа такого (вместо CustVendTable - ваш мап)
X++: { DictTable dictTable = new DictTable(tableNum(CustVendTable)); int i; CustVendTable _vendTable; CustVendTable _custTable; CustTable CustTable; VendTable VendTable; ; select CustTable; vendTable.clear(); _vendTable = vendTable; _custTable = custTable; if (dictTable) { for (i=1;i<=dictTable.fieldCnt();i++) { try { _vendTable.(dictTable.fieldCnt2Id(i)) = _custTable.(dictTable.fieldCnt2Id(i)); } catch { } } } info(_vendTable.xml()); }
__________________
Axapta v.3.0 sp5 kr2 |
|
20.07.2009, 16:28 | #9 |
Участник
|
Цитата:
Цитата:
PS. Есть такой класс MappingsInfo_RU, позволяющий для указанного Map и таблицы по названию поля Map получить код соотв. поля таблицы. Единственный косяк в нем - это использование в методе findMappingTreeNode() метода infolog.getNode() вместо обычного TreeNode::findNode(). Из-за этого и соотв. TreeNode, и затем TreeNodeIterator создаются на клиенте, что приводит при использовании класса на сервере к дикому трафику, тормозам и росту отжираемой памяти (может, уже и исправили этот кусок). А так, если создать, как советовали, свой Map и затем получить с помощью указанного класса данные по двум связанным через Map таблицам, то можно пробежаться по полученным Map'ам (на этот раз - экземплярам класса-контейнера) и скопировать значения полей, не рискуя "случайно" нарваться на поле Map, для которого в одной из таблиц нет отображения. |
|
|
За это сообщение автора поблагодарили: ZVV (2), Kashesh (1). |
20.07.2009, 16:54 | #10 |
Участник
|
О! спасибо, на счет своего мапа я и не подумал, так и сделаю. Заодно и классик посмотрю. PS я как раз через buf2buf и делал, только еще исключения передавал
|
|
20.07.2009, 17:08 | #11 |
Боец
|
Цитата:
Если вдруг подозрение оправдается, то try/catch можно заменить на условие: X++: if (new dictField(_vendTable.TableId, dictTable.fieldCnt2Id(i)) && new dictField(_custTable.TableId, dictTable.fieldCnt2Id(i)) ) { _vendTable.(dictTable.fieldCnt2Id(i)) = _custTable.(dictTable.fieldCnt2Id(i)); } |
|
20.07.2009, 19:44 | #12 |
Участник
|
2 ZVV
Идентификаторы полей таблиц не обязаны соответствовать идентификаторам полей мапа, по-этому такой код во многих случаях будет отрабатывать неправильно 2 Gl00mie Насчет try..catch согласен, но я больше в иллюстративных целях код привел
__________________
Axapta v.3.0 sp5 kr2 |
|
20.07.2009, 21:20 | #13 |
MCITP
|
__________________
Zhirenkov Vitaly |
|
20.07.2009, 21:42 | #14 |
Участник
|
Ой. Сори
Цитата:
Сообщение от ZVV
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 20.07.2009 в 21:44. |
|
Теги |
map, синхронизация баз |
|
Похожие темы | ||||
Тема | Ответов | |||
Как сделать фильтр по группе пользователей? | 12 | |||
Группа полей | 2 | |||
Заумный отчет по ОС, как сделать? | 13 | |||
Как лучше сделать? | 7 | |||
очистка полей. простой вопрос | 4 |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|