|
08.05.2009, 10:56 | #1 |
Участник
|
Копирование строк InventTransferLine
Стоит задача скопировать заказ InventTransferTable со всеми строками InventTransferLine , с заказом проблем нет:
iTT.data(InventTransferTable); itt.TransferId =""; itt.TransferStatus = InventTransferStatus::Created; itt.insert(); но копировать строки в по аналогии не получается! iTL.data(InventTransferLine); iTL.TransferId = iTT.TransferId; iTL.InventTransId = ""; iTL.InventTransIdReceive = ""; iTL.InventTransIdScrap = ""; iTL.insert(); Строки просто меняют InventTransId,InventTransIdReceive,InventTransIdScrap и TransferId на новые... получается что я не копирую , а вырезаю! Помогите плз... |
|
08.05.2009, 11:06 | #2 |
Боец
|
Загляните в метод \Data Dictionary\Tables\InventTransferLine\Methods\insert. Там запрограммирована логика при вставке записи, которая и меняет эти поля.
Если вы хотите эту логику опустить, то вместо .insert() нужно вызывать .doInsert(). Но! В этом случае, вы рискуете нарушить целостность данных системы, вставив записи с некорректными значениями. |
|
08.05.2009, 11:17 | #3 |
Участник
|
Цитата:
Сообщение от DSPIC
Загляните в метод \Data Dictionary\Tables\InventTransferLine\Methods\insert. Там запрограммирована логика при вставке записи, которая и меняет эти поля.
Если вы хотите эту логику опустить, то вместо .insert() нужно вызывать .doInsert(). Но! В этом случае, вы рискуете нарушить целостность данных системы, вставив записи с некорректными значениями. А что имеется ввиду под копированием? Если в точности запись, то этого в принципе нельзя сделать, в любом случае номер лота(InventTransId) нужно будет менять. |
|
08.05.2009, 11:22 | #4 |
MCITP
|
Поясните плиз эту фразу - не понятно что вы имеете ввиду под "вырезаю" и под "копирую"..
Как по вашему должно быть?
__________________
Zhirenkov Vitaly |
|
08.05.2009, 11:38 | #5 |
Участник
|
Цитата:
Вырезаются - я имел ввиду что строки просто из одного заказа привязываются к новому! Последний раз редактировалось hated8; 08.05.2009 в 11:45. |
|
08.05.2009, 11:54 | #6 |
Участник
|
Ладно , вопрос снимаю сделал!
iTL.InventTransId = NumberSeq::newGetNum(InventParameters::numRefInventTransId()).num(); iTL.InventTransIdReceive = NumberSeq::newGetNum(InventParameters::numRefInventTransId()).num(); iTL.doinsert(); Подеревенски но сделал))) |
|
08.05.2009, 12:02 | #7 |
MCITP
|
Вы хотели сказать "через з...цу, но сделал", наверное.
Вам же рекомендовали посмотреть метод Insert... Пару движений мышкой и находим в методе updateEstimated следующий код X++: if (this.RecId) this.doUpdate(); else this.doInsert();
__________________
Zhirenkov Vitaly |
|
08.05.2009, 12:27 | #8 |
Боец
|
Цитата:
Соответсвенно, вам надо то было просто обнулить RecId помимо прочего перед инсертом (я кстати всегда так делаю в подобных случаях - так красивее и интуитивно понятнее имхо). И так будет гораздо правильнее, чем ваш последний вариант.
\Classes\Global\buf2Buf Эта ф-я системные поля не копирует и, возможно, поможет избежать неожиданных проблем. Мало ли, в будущем (или настоящем..), ручное изменение системного поля что-нить поломает. |
|
|
За это сообщение автора поблагодарили: aidsua (1). |
12.05.2009, 07:40 | #9 |
Участник
|
Опять тупик!
Добавляю строку так: iTL.initFromInventTransferTable( iTT, true); iTL.TransferId = ...; iTL.ItemId = ...; iTL.LineNum = ...; iTL.QtyTransfer = ...; iTL.recId = 0; iTL.insert(); Всё норм , но в InventTrans не создаётся соответствующих записей, как это происходит при добавлении строки InventTransferLine вручную! Как быть? |
|
12.05.2009, 08:52 | #10 |
Программатор
|
перед заполнением таблицы clear вызываете? И зачем iTL.recId = 0; и покажите что у вас там вместо точек.
А вообще вопрос на 5 минут дебага. У меня к сожалению этой таблицы нет, но ставим точку останова в insert всех таблиц, которые интересуют и понеслась душа в рай. Сначала ручной способ ввода строки. а потом Ваш программный. Не понимаю в чём сложность. |
|
12.05.2009, 13:46 | #11 |
MCITP
|
Цитата:
Сообщение от Sada
перед заполнением таблицы clear вызываете? И зачем iTL.recId = 0; и покажите что у вас там вместо точек.
А вообще вопрос на 5 минут дебага. У меня к сожалению этой таблицы нет, но ставим точку останова в insert всех таблиц, которые интересуют и понеслась душа в рай. Сначала ручной способ ввода строки. а потом Ваш программный. Не понимаю в чём сложность. Цитата:
Сообщение от hated8
Опять тупик!
Добавляю строку так: iTL.initFromInventTransferTable( iTT, true); iTL.TransferId = ...; iTL.ItemId = ...; iTL.LineNum = ...; iTL.QtyTransfer = ...; iTL.recId = 0; iTL.insert(); Всё норм , но в InventTrans не создаётся соответствующих записей, как это происходит при добавлении строки InventTransferLine вручную! Как быть? Проблема наверняка в методах типа setPreTransEstimated в InventMovement. Аксапта считает, что вы не меняли кол-во remainPhysical не менялось и значит ничего делать не надо... Я так понимаю вы решили отказаться от варианта использовать .data() или buf2Buf? Из-за этого как раз так и могло произойти... Или тут просто не весь код?
__________________
Zhirenkov Vitaly |
|
11.08.2009, 14:14 | #12 |
Участник
|
Был Джобик для создания строки
X++: static void CreateInventTransferTable(Args _args) { InventTransferTable InventTransferTable; InventTransferLine InventTransferLineNew; InventTable inventTable; InventDim inventDim; itemId ItemId = '0681602'; // Код товара InventLocationId InventLocationId = '005'; //Склад откуда ; inventTable = inventTable::find(ItemId); if (!inventTable) throw error("Не найдена номенклатура!"); InventTransferTable = InventTransferTable::find('ПЕР0000034'); if (!InventTransferTable) throw error("Журнал не найден !"); InventTransferLineNew.clear(); InventTransferLineNew.initFromInventTransferTable(InventTransferTable,true); InventTransferLineNew.ItemId = inventTable.ItemId; InventTransferLineNew.initFromInventTable(inventTable); InventMovement::bufferSetRemainQty(InventTransferLineNew,InventMovSubType::None); InventMovement::bufferSetRemainQty(InventTransferLineNew,InventMovSubType::TransferOrderTransitFrom); InventTransferLineNew.insert(); } Последний раз редактировалось Hal; 11.08.2009 в 14:26. |
|