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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.06.2002, 13:24   #1  
Anton Sk. is offline
Anton Sk.
Участник
 
35 / 11 (1) +
Регистрация: 14.11.2002
? Проблема с таблицей InventDim
Существует неотфактурованная Закупка со строками. В строках нет ГТД. Хочу по нажатию на кнопку во все строки Закупки вставить один и тот же ГТД (новый или уже существующий, выбираю/ввожу в дилоге).
Нахожу строчку в InventDim. Изменяю поле InventGTDId_Ru. При этом изменяю таблицу InventGTD_Ru, если там нет пары: ItemId - inventGTD_Ru. Все это в цикле для всех строк Закупки.
Так вот, поле InventGTDId_Ru в существующей строке таблицы InventDim не редактируется. С Закупкой еще ничего не делалось. Пытаюсь в браузере Аксапты внести изменения в это поле. То же самое.


Но в форме PurchTable в строках вручную мы можем поправиь ГТД. А вот в коде не получается. В чем дело?

P.S. Предполагается, что товар, который приходуется в данной Закупке, должен иметь ГТД.
__________________
Антон Скоробогатов
Старый 21.06.2002, 13:33   #2  
SergS is offline
SergS
Участник
 
8 / 13 (1) ++
Регистрация: 19.06.2002
Адрес: Балашиха
Таблица InventDim славится тем что в нее нельзя добавлять и редактированть записи из формы InventDim

//Это перекрытый метод update() у таблицы InventDim Insert такой же

void update(boolean doUpdate = false)
{
if (doUpdate)
super();
}

Соответственно если необходимо добавить/Изменить данные в этой таблице в методы Insert и Update необходимо передавать параметр

InventDim.Update(true);
inventDim.Insert(True);
Старый 21.06.2002, 14:17   #3  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,729 / 843 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Исправление InventDim
Использование InventDim.Update(true); inventDim.Insert(True); в данном случаи мне кажется неправильным, так как новая аналитика может уже существовать
Лучше поступить так
PHP код:
InventDim  oldInventDimnewInventDim;
;

// Для каждой строки закупки получаем
oldInventDim InventDim::find(purchLine.InventDimId);

// Изменяем ГТД
oldInventDim.InventGtdId_RU "ГТД"

// создаем или находим аналитику
newInventDim InventDim::findOrCreate(oldInventDim);

// изменяем строку закупки
purchLine.InventDimId newInventDim.InventDimId
purchLine
.update(); 
Еще интересно посмотреть, что будет со складскими проводками и остатками по старой и новой аналитикам
Старый 24.02.2004, 13:43   #4  
ДК is offline
ДК
Участник
 
43 / 10 (1) +
Регистрация: 24.06.2003
Адрес: Краснодар
Проблема развивается следующим образом:
Простая установка пустых ГТД не дает нужного результата т.к. в проводках будут участвовать СТАРЫЕ значения ГТД!
__________________
-----------------------------------------
Искренне Ваш, ДК.
Старый 24.02.2004, 14:13   #5  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,998 / 3914 (188) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано ДК
...в проводках будут участвовать СТАРЫЕ значения ГТД!
в РАЗНЕСЕННЫХ проводках (отфактурованных заказов)? конечно. А как иначе?

Для изменения аналитики в разнесенных складских проводках пользуйтесь формой Редактирование кодов аналитики в функциях номенклатуры.
Старый 24.02.2004, 14:54   #6  
EVGL is offline
EVGL
Moderator
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,865 / 2374 (87) +++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
в РАЗНЕСЕННЫХ проводках (отфактурованных заказов)?
В ЛЮБЫХ. Никогда не замечали: стираете аналитику в строке заказа, а в складской проводке значение остается? Известная feature.

Теперь по сути: Wamr все правильно написал. А метод purchLine.update() (точнее, вызываемый им PurchLineType.update()) сам займется тем, чтобы обновлять связанные складские проводки, остатки и резервирование.
Старый 24.02.2004, 15:12   #7  
ДК is offline
ДК
Участник
 
43 / 10 (1) +
Регистрация: 24.06.2003
Адрес: Краснодар
PHP код:
void clicked()
{
    
SalesLine           salesLineSelect;
    
InventTrans         inventTrans;
    
InventDim           oldInventDimnewInventDim;
    ;
        
TTSBEGIN;
        while 
select forupdate salesLineSelect where salesLineSelect.SalesId == SalesTable.SalesId
        
{
            
//получили аналитику строки
            
oldInventDim InventDim::find(salesLineSelect.inventDimId);
            
//установили "пустую" ГТД
            
oldInventDim.InventGtdId_RU "";
            
//нашли / создали новую аналитику
            
newInventDim InventDim::findOrCreate(oldInventDim);
            
//если есть проводки - правим InventDim в проводке
            
inventTrans InventTrans::findTransId(salesLineSelect.InventTransIdtrue);
            if (
inventTrans)
            {
                
inventTrans.inventDimId newInventDim.InventDimId;
                
inventTrans.doUpdate();
            }
            
//а вот теперь меняем аналитику в строке на новую
            
salesLineSelect.InventDimId newInventDim.InventDimId;
            
salesLineSelect.update();
        }
        
TTSCOMMIT;
        
Salesline_ds.research();

А стандартные методы, работающие для других аналитик, не всегда работают так же с ГТД. feature наверное
__________________
-----------------------------------------
Искренне Ваш, ДК.
Старый 24.02.2004, 15:19   #8  
EVGL is offline
EVGL
Moderator
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,865 / 2374 (87) +++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Сотрите свой код, лучше не позорьтесь.
Старый 24.02.2004, 15:56   #9  
ДК is offline
ДК
Участник
 
43 / 10 (1) +
Регистрация: 24.06.2003
Адрес: Краснодар
Цитата:
Изначально опубликовано EVGL
Сотрите свой код, лучше не позорьтесь.
Ну, в Axapta я еще совсем "зеленый", а этот код (для моего случая) работает.
Аргументы можно?
__________________
-----------------------------------------
Искренне Ваш, ДК.
Старый 24.02.2004, 16:32   #10  
EVGL is offline
EVGL
Moderator
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,865 / 2374 (87) +++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Прошу прощения, злой я сегодня.
Аргументы:
  1. inventTrans.doUpdate() - это очень сильно. Опустив вызов .update(), вы отключили десятки экранов кода, который обновляет накопленные суммы складских остатков, уменьшая остатки по старому коду аналитики и увеличивая по новому. База данных испорчена до следующего запуска корректировки данных складского модуля.
  2. по существу задачи. Сам тот эффект, с которым вы боретесь, запрограммирован датчанами нарочно в методе InventDim.mergeUsedDim(). На тот счет существует запрос в NSS, в ответе на который объясняется, что сброс аналитики ведет к несоответствиям в данных о резервированию. Лично подтвердить не могу, но им виднее.
  3. среди тех проводок, что вы огребли методом InventTrans::findTransId(), могут быть и разнесенные.
  4. метод InventTrans::findTransId() возвращает только одну запись, хотя отношение строк заказа к складким проводкам - 1:N.
  5. Более того, складские проводки не должны иметь ту же аналитику, что и строка заказа. Пример: заказ на 20 экскаваторов порождает отгрузку 20 единиц с различными серийными номерами. 1 строка заказа -> 20 проводок с различной аналитикой.

Уффф...
Старый 24.02.2004, 16:49   #11  
ДК is offline
ДК
Участник
 
43 / 10 (1) +
Регистрация: 24.06.2003
Адрес: Краснодар
Спасибо огромное за столь аргументированый ответ.
Мой случай:
1. Учет по ГТД не ведется. Т.е. мне нужно сначала установить ГТД, Вывести СФ (без обработки) и сбросить (обнулить) ГТД.
2. Доступность кнопок Установка/Сброс определяется состоянием Заказа, т.е. разнесенных существуют только проводки со статусом "В заказе".
3. Серийных номерв/партий нет, т.е. SalesLine - InventTrans 1:1
Т.е. для моего случая код абсолютно рабочий, кроме того, почему
Цитата:
Опустив вызов .update(),
? Наоборот, разобравшись с этим методом мы его и запускаем.
Да мы натолкнулись на метод InventDim.mergeUsedDim(), который не совсем правильно отрабатывает именно ГТД.
В любом случае - спасибо.
__________________
-----------------------------------------
Искренне Ваш, ДК.
Старый 24.02.2004, 17:11   #12  
EVGL is offline
EVGL
Moderator
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,865 / 2374 (87) +++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
:)
Можно ли называть рабочим, скажем, сгнивший деревенский мост, посредине которого здоровенная дыра? По вашей логике, можно, поскольку мотоциклы, которыми в 80% пользуются местные, могут ее объехать, а вокруг дыры построены перила.

Еще раз: вместо InventTrans.doUpdate() ставят InventTrans.update().

SalesLine - InventTrans 1:1 нарушится сразу, как только кто-нибудь сдалает частичную отгрузку.

И вообще: правильно ли я понял, что проблема в выводе на печать счета-фактуры? Почему же ее решение в том, чтобы раскурочивать заказы?
Старый 24.02.2004, 17:43   #13  
ДК is offline
ДК
Участник
 
43 / 10 (1) +
Регистрация: 24.06.2003
Адрес: Краснодар
PHP код:
....
            
//если есть проводки - правим InventDim в проводке
            
while select forupdate inventTrans where inventTrans.InventTransId == salesLineSelect.InventTransId
            
{
              if (
inventTrans)
                {
                    
inventTrans.inventDimId newInventDim.InventDimId;
                    
inventTrans.Update();
                }
            }
            
//а вот теперь меняем аналитику в строке на новую
.... 
Хозяин, а такой колор подойдет? © Мимино
Так.. в результате вроде родили деревенский мост без дырки.
Спасибо.
__________________
-----------------------------------------
Искренне Ваш, ДК.
Старый 24.02.2004, 18:05   #14  
EVGL is offline
EVGL
Moderator
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,865 / 2374 (87) +++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Почти... почти...
Вот пример запроса из InventUpd_Financial.updateFinancialReceipt(), отсекающего недопустимые статусы:
PHP код:
while select forupdate inventTrans
        Index hint TransIdIdx
        where inventTrans
.inventTransId     == movement.transId()         &&
              
inventTrans.statusIssue       == StatusIssue::None          &&
              
inventTrans.statusReceipt     == StatusReceipt::Received

Ваш запрос берет лишнее в случае частичной отгрузки/резервирования/регистрации и т.п.

И последняя [уже придирка] к несчастным 4 строчкам кода: if (inventTrans) лишено смысла, т.к. внутрь цикла while select можно войти только тогда, если запрос успешно вернул очередную проводку. if будет выполняться всегда.
Старый 23.03.2004, 12:12   #15  
ArturK is offline
ArturK
Участник
 
81 / 10 (1) +
Регистрация: 13.08.2003
?
Я пишу в точности как вы предложили

PHP код:
   salesLineSelect.InventDimId newInventDim.InventDimId;
            
salesLineSelect.update(); 
Но у меня никакого обновления в строке не происходит.
То что новый newInventDim.InventDimId есть - это точно, проверяю info().
В чем может быть причина?

Правда вместо конструкции

PHP код:
 select forupdate ... 
я использую, перебор Query c помощью getNext()
Это может влиять на неработу update()?

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
inventUpd_reservation использование inventDim SHiSHok DAX: Программирование 2 31.03.2007 21:32
Проблема с составлением Query axaLearner DAX: Программирование 10 01.12.2005 15:00
InventDim.findOrCreateBlank - простое сложно? Pavlo AKA Panok DAX: Программирование 5 25.10.2004 16:50
Работа с InventDim... NJD DAX: Программирование 11 17.06.2004 14:42
Проблема с временной таблицей MIkeFW DAX: Программирование 5 18.09.2003 11:58
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:43.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.