AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.05.2009, 10:56   #1  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 27.06.2008
? Копирование строк 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  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Загляните в метод \Data Dictionary\Tables\InventTransferLine\Methods\insert. Там запрограммирована логика при вставке записи, которая и меняет эти поля.

Если вы хотите эту логику опустить, то вместо .insert() нужно вызывать .doInsert().

Но! В этом случае, вы рискуете нарушить целостность данных системы, вставив записи с некорректными значениями.
Старый 08.05.2009, 11:17   #3  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Загляните в метод \Data Dictionary\Tables\InventTransferLine\Methods\insert. Там запрограммирована логика при вставке записи, которая и меняет эти поля.

Если вы хотите эту логику опустить, то вместо .insert() нужно вызывать .doInsert().

Но! В этом случае, вы рискуете нарушить целостность данных системы, вставив записи с некорректными значениями.
Через doInsert() нельзя, поскольку на таблице есть уникальный индекс по InventTransId, запись не будет вставлена.

А что имеется ввиду под копированием? Если в точности запись, то этого в принципе нельзя сделать, в любом случае номер лота(InventTransId) нужно будет менять.
Старый 08.05.2009, 11:22   #4  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от hated8 Посмотреть сообщение
... получается что я не копирую , а вырезаю!
Поясните плиз эту фразу - не понятно что вы имеете ввиду под "вырезаю" и под "копирую"..
Как по вашему должно быть?
__________________
Zhirenkov Vitaly
Старый 08.05.2009, 11:38   #5  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 27.06.2008
Цитата:
Сообщение от ZVV Посмотреть сообщение
Поясните плиз эту фразу - не понятно что вы имеете ввиду под "вырезаю" и под "копирую"..
Как по вашему должно быть?
Скопировать это - создать такие же строки но с новыми TransferId InventTransId InventTransIdReceive InventTransIdScrap!
Вырезаются - я имел ввиду что строки просто из одного заказа привязываются к новому!

Последний раз редактировалось hated8; 08.05.2009 в 11:45.
Старый 08.05.2009, 11:54   #6  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 27.06.2008
Ладно , вопрос снимаю сделал!
iTL.InventTransId = NumberSeq::newGetNum(InventParameters::numRefInventTransId()).num();
iTL.InventTransIdReceive = NumberSeq::newGetNum(InventParameters::numRefInventTransId()).num();
iTL.doinsert();
Подеревенски но сделал)))
Старый 08.05.2009, 12:02   #7  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от hated8 Посмотреть сообщение
Подеревенски но сделал)))
Вы хотели сказать "через з...цу, но сделал", наверное.

Вам же рекомендовали посмотреть метод Insert...
Пару движений мышкой и находим в методе updateEstimated следующий код
X++:
    if (this.RecId)
        this.doUpdate();
    else
        this.doInsert();
Соответсвенно, вам надо то было просто обнулить RecId помимо прочего перед инсертом (я кстати всегда так делаю в подобных случаях - так красивее и интуитивно понятнее имхо). И так будет гораздо правильнее, чем ваш последний вариант.
__________________
Zhirenkov Vitaly
Старый 08.05.2009, 12:27   #8  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Соответсвенно, вам надо то было просто обнулить RecId помимо прочего перед инсертом (я кстати всегда так делаю в подобных случаях - так красивее и интуитивно понятнее имхо). И так будет гораздо правильнее, чем ваш последний вариант.
Лучше RecId не трогать, пока по эстетическим соображениям. А вместо .data() применять

\Classes\Global\buf2Buf

Эта ф-я системные поля не копирует и, возможно, поможет избежать неожиданных проблем. Мало ли, в будущем (или настоящем..), ручное изменение системного поля что-нить поломает.
За это сообщение автора поблагодарили: aidsua (1).
Старый 12.05.2009, 07:40   #9  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 27.06.2008
Опять тупик!

Добавляю строку так:
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  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
перед заполнением таблицы clear вызываете? И зачем iTL.recId = 0; и покажите что у вас там вместо точек.
А вообще вопрос на 5 минут дебага. У меня к сожалению этой таблицы нет, но ставим точку останова в insert всех таблиц, которые интересуют и понеслась душа в рай. Сначала ручной способ ввода строки. а потом Ваш программный. Не понимаю в чём сложность.
Старый 12.05.2009, 13:46   #11  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от 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  
Hal is offline
Hal
Участник
Axapta Retail User
 
9 / 10 (1) +
Регистрация: 05.11.2004
Адрес: Москва
Был Джобик для создания строки

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.
Теги
doinsert, insert, заказ на перемещение

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Тормозит копирование строк в буфер обмена ivas DAX: Программирование 20 21.08.2007 15:05
Копирование строк из InventJournalTrans в SalesLine Petruccio DAX: Программирование 11 29.09.2006 11:40
Копирование строк шаблона RV DAX: Программирование 4 24.05.2005 14:10
БАГ: копирование строк накладных в новый заказ Антон Солдатов DAX: Функционал 2 03.12.2004 09:02
Копирование строк в одинаковых таблицах Ivan Mischenko DAX: Программирование 9 15.01.2004 18:08
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 06:43.