27.02.2009, 11:35 | #1 |
Участник
|
вопрос по Buf2Buf
Имеется такой код, но при выполнении выдает ошибку:
"Поле с кодом "1" в таблице "Common" не обнаружено." как можно избежать эту ошибку? или только использовать переменные таблиц каждого типа, определять тип _record и уже в нужную переменную копировать. Хотелось бы кода по минимуму и чтобы метод был универсальным для записи любой таблицы, переданной в качестве параметра. X++: Common _newrecord, _record; ; .... ChangeCompany("DAT") { buf2buf(_record,_newrecord); _newrecord.insert(); } |
|
27.02.2009, 11:44 | #2 |
Ищущий знания...
|
buf2buf можно использовать только для таблиц, у которых одинаковая структура полей, полностью совпадает...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
27.02.2009, 11:48 | #3 |
Участник
|
а в моем случае она совпадает.
в _record я передаю запись а _newrecord так и остается common. |
|
27.02.2009, 11:48 | #4 |
Участник
|
Перед вызовом buf2buf используйте makeRecord
X++: _newrecord = new DictTable(record.tableId).makeRecord(); |
|
|
За это сообщение автора поблагодарили: propeller (1). |
27.02.2009, 11:55 | #5 |
Ищущий знания...
|
Цитата:
воспользуйтесь советом tourist
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
27.02.2009, 12:12 | #6 |
MCITP
|
Цитата:
propeller, совершенно верно вам выше подсказали, нужно табличную переменную "коммон" как бы инициализировать нужным типом, иначе она останется просто "коммон" и с ней практически ничего нельзя будет сделать. buf2buf() или data() этого не делают.
__________________
Zhirenkov Vitaly |
|
27.02.2009, 12:35 | #7 |
Участник
|
да уже так сделал. пока все супер, спасибо за совет
|
|
27.02.2009, 12:47 | #8 |
Ищущий знания...
|
Цитата:
в обычном common нет полей (TableId, RecId не считаю)
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
27.02.2009, 17:21 | #9 |
Участник
|
а вот такой вопрос еще:
видимо makerecord() создает запись уже с новым (сгенерированым) recid . можно ли как-то скопировать запись в другую компанию чтобы RecId был одинаковым. ? |
|
27.02.2009, 17:33 | #10 |
MCITP
|
Цитата:
Учтите, что buf2buf() recid не копирует, а data() - копирует. X++: static void Job216(Args _args) { SalesTable st; Common st3; ; select firstonly st; st3 = new DictTable(st.tableId).makeRecord(); info(int2str(st3.RecId)); buf2buf(st,st3); info(int2str(st3.RecId)); st3.clear(); st3.data(st); info(int2str(st3.RecId)); } Цитата:
Сообщение (16:31:15)
0 0 102439380
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: samolalex (1). |
27.02.2009, 17:35 | #11 |
Ищущий знания...
|
Ну вообщето не желательно... Ведь в другой компании тот RecId, который вы копируете, может уже использоваться. Да и вообще лучше не трогать RecId, потом может возникнуть много проблем.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
27.02.2009, 17:41 | #12 |
Участник
|
тогда я не знаю. как мне зацепится.
потому что у меня не только insert() но и update(). нужно как то найти если такая запись в другой компании для того чтобы понять апдейтить ее или инсертить. кроме recid больше не знаю как можно выйти из такой ситуации. ведь у меня могут быть разные таблицы , соответственно и поля в них разные. |
|
27.02.2009, 17:44 | #13 |
MCITP
|
Цитата:
Сообщение от propeller
тогда я не знаю. как мне зацепится.
потому что у меня не только insert() но и update(). нужно как то найти если такая запись в другой компании для того чтобы понять апдейтить ее или инсертить. кроме recid больше не знаю как можно выйти из такой ситуации. ведь у меня могут быть разные таблицы , соответственно и поля в них разные. но не recId...
__________________
Zhirenkov Vitaly |
|
27.02.2009, 17:47 | #14 |
Участник
|
ввести это тоже проблема. у меня может 15 таблиц копироваться, не хочется во всех таблицах добавлять поле(
|
|
27.02.2009, 17:53 | #15 |
MCITP
|
Цитата:
С recId не получится, т.к. они в разных компаниях разные, свой генератор последовательности.. Если вы на них завяжетесь будет не "очень хорошо"... Да и сделать инсерт() с желаемым recId всё равно аксапта не даст - сгенерит свой..
__________________
Zhirenkov Vitaly |
|
27.02.2009, 18:12 | #16 |
Axapta
|
Цитата:
А то была вот такая вот тема помнится (Как вызвать один метод при записи в любую таблицу), так сначала спросили про "любую таблицу", а потом оказалось, что их всего пять. |
|
02.03.2009, 11:35 | #17 |
Участник
|
Всем спасибо за помощь.
вот такой еще вопрос. можно ли не вешая на каждую таблицу в инсерте и в апдейте эту трансляцию, а где то все это в одном месте перекрыть? |
|
02.03.2009, 12:17 | #18 |
Участник
|
Простите, я не прочитал всю ветку полностью, но рискну дать совет:
X++: Common _newrecord, _record; ; .... ChangeCompany("DAT") { [B] _newRecord = null;[/B] buf2buf(_record,_newrecord); _newrecord.insert(); } |
|
02.03.2009, 12:46 | #19 |
NavAx
|
можно и без ChangeCompany
X++: static void Job2(Args _args) { SalesTable salesTable; SalesTable salesTableNew; ; select firstonly reverse salesTable; salesTableNew = null; salesTableNew.company("DAT"); buf2Buf(salestable, salesTableNew); salesTableNew.doinsert(); ChangeCompany("DAT") { salesTableNew = null; salesTableNew = SalesTable::find(salesTable.SalesId); info(strfmt("%1 %2 %3", salesTableNew.dataAreaId, salesTableNew.RecId, salesTableNew.SalesId)); } } |
|
02.03.2009, 13:37 | #20 |
Участник
|
да с этим уже все понятно. вот может кто на мой последний вопрос подскажет.
|
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|