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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.06.2014, 14:28   #1  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Как реализовать смену тарифа на ходу?
Добрый день! Ситуация такая: пользователь формирует заказ на продажу, и если замечает, что где-то видит неправильный тариф - открывает удобную форму, в котором перечислены строки заказа с возможностью редактирования цены из PriceDiscTable напротив каждой позиции.

Есть ли какие-то идеи у вас? Как-то это можно сделать?
Старый 04.06.2014, 14:50   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Что я понял из вашего вопроса.Нужно сделать так, чтобы пользователь мог редактировать цену
Что я не понял. Где редактировать цену? в строке заказа? в прайсе? что значит удобную? чем неудобно то что есть сейчас? Нужно отфильтровать прайс, оставив там только позиции из заказа?
Старый 04.06.2014, 14:57   #3  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Нужно сделать так, чтобы пользователь мог редактировать цену.
Да

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Где редактировать цену? в строке заказа? в прайсе?
Через отдельную форму в прайсе (т.е. человек увидел, что цена неправильная, открыл эту форму, подправил, закрыл. ВСЕ теперь действует та цена которую он поставил)

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
что значит удобную?
Чтобы далеко никуда не лазить

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
чем неудобно то что есть сейчас?
Нужно далеко лазить

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Нужно отфильтровать прайс, оставив там только позиции из заказа?
По сути да. Отобразить позиции в таблице и добавить напротив каждой позиции текущую цену с возможностью редактирования и обновления в PriceDiscTable
Старый 04.06.2014, 15:16   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
В общем случае для определения по позиции в заказе используемой строки прайса нужно использовать стандартный класс PriceDisc. Вам скорее всего пригодится метод PriceDisc::newFromSalesPurchLine().

Формируйте временную таблицу и сохраняйте для каждой позиции RecId строки прайса. На основании этой ссылки потом выполняйте обновление.
Старый 04.06.2014, 15:29   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Немного выскажусь по постановке самой задачи. Часто "неправильная" цена в строке заказа вызвана не ошибкой в прайсе, а ошибкой в заказе (пользователь поставил не ту дату, не ту группу и т.д). Т.е. по введенным параметрам система находит не ту позицию в прайсе, которую имел в виду пользователь. И здесь уже нужно исправлять не прайс а заказ. Как вы собираетесь учить пользователей отделять мух от котлет?

Ещё прайс, как правило - это документ, который должен утверждаться ответственными лицами и так просто позволять его править под конкретный заказ...
Старый 04.06.2014, 16:28   #6  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,508 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
прайс, как правило - это документ, который должен утверждаться ответственными лицами и так просто позволять его править под конкретный заказ...
согласен
для определения "неправильности" прайса в системе нужно иметь перед глазами второй ("правильный"). а вот откуда он будет браться...
__________________
С уважением,
Вячеслав
Старый 05.06.2014, 05:58   #7  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от pitersky Посмотреть сообщение
согласен
для определения "неправильности" прайса в системе нужно иметь перед глазами второй ("правильный"). а вот откуда он будет браться...
Правильный прайс есть и он перед глазами. Другое дело - за ним в аксапте пока некому следить, т.к. только идет внедрение, а работа по заказам уже идет
Старый 05.06.2014, 06:03   #8  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Немного выскажусь по постановке самой задачи. Часто "неправильная" цена в строке заказа вызвана не ошибкой в прайсе, а ошибкой в заказе (пользователь поставил не ту дату, не ту группу и т.д). Т.е. по введенным параметрам система находит не ту позицию в прайсе, которую имел в виду пользователь. И здесь уже нужно исправлять не прайс а заказ. Как вы собираетесь учить пользователей отделять мух от котлет?
Ошибка в прайсе, а не в заказе, т.к. до стандартного функционала создания заказов наших пользователей никто допускать не собирается. Это грозит катастрофой вплоть ДАЖЕ до отказа от аксапты

По поводу правильности - пост выше. За ценами пока следить некому, поэтому на время можно придумать такую форму

Спасибо, буду пробовать сегодня
Старый 05.06.2014, 07:09   #9  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Формируйте временную таблицу и сохраняйте для каждой позиции RecId строки прайса. На основании этой ссылки потом выполняйте обновление.
Если грубо, получается мне нужно создать новую строку в PriceDiscTable, наполнить ее данными из PriceDisc по строке заказа и записать с корректной датой, так?

А для чего в PriceDisc нужен метод priceTable? Это, случайно, не как раз новая строка для новой цены?
Старый 05.06.2014, 08:18   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Vasiliusis Посмотреть сообщение
Если грубо, получается мне нужно создать новую строку в PriceDiscTable, наполнить ее данными из PriceDisc по строке заказа и записать с корректной датой, так?
Я надеялся что она (строка) у вас там (в прайсе, в таблице PriceDiscTable) уже есть. И в ней только лишь необходимо скорректировать цену. В вопросе просто шла речь про редактирование, а не создание.

Цитата:
Сообщение от Vasiliusis Посмотреть сообщение
А для чего в PriceDisc нужен метод priceTable? Это, случайно, не как раз новая строка для новой цены?
Класс PriceDisc служит для навигации по прайсу, а не для его наполнения. Метод PriceTable возвращает существующую строку прайса, найденную в методе findPriceAgreement.

Если речь идет не о редактировании прайса, а о его создании. То тут ещё большие неопределённости чем с редактированием. Ведь цена может быть заведена как общая (для всех клиентов, для группы клиентов, для ценовой группы и .т.д) так и до определенной степени персональная. Какую именно цену необходимо заводить в каждом конкретном случае?

В общем случае прайс может иметь очень сложную структуру. Вы оперируете термином тариф. возможно в вашем случае решать задачу в общем виде не целесообразно. Для однозначности нужно принять ограничения на структуру прайса. Если прайс будет однородным, то не сложно будет вручную запрограммировать вставку строк в PriceDiscTable.

Как вариант можно заранее нагенерировать автоматически все необходимые позиции прайса, оставив цену нулевой. И тем самым свести задачу создания к задаче редактирования.

Последний раз редактировалось S.Kuskov; 05.06.2014 в 08:28.
Старый 05.06.2014, 08:35   #11  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Я надеялся что она (строка) у вас там (в прайсе, в таблице PriceDiscTable) уже есть. И в ней только лишь необходимо скорректировать цену. В вопросе просто шла речь про редактирование, а не создание.
Да, речь о редактировании, созданием не будем заниматься, действительно много переменных....

В общем, для начала, я написал такой код, не сработало
X++:
public void init()
{
    PriceDisc               priceDisc;
    PriceDiscTable          newPrice;
    SalesLine       salesLine2 = SalesLine::find('SO-000444', 1);    //берем для примера
    
    
    super();

    //тут проблем нет
    priceDisc = PriceDisc::newFromSalesPurchLine(SalesLine2);

    //а тут я не понимаю, почему метод findPriceAgreement возвращает Boolean. Как итог разумеется newPrice ни содержит ничего.
    priceDisc.findPriceAgreement(SalesLine2.priceGroupId(), SalesLine2.inventDim().inventDimId);
    newPrice = priceDisc.priceTable();
}
Может я неправильно вызываю метод findPriceAgreement? Как вы сказали, он ищет строку прайса. А потом методом priceTable я эту строку получаю как PriceDiscTable... но не работает почему-то
Старый 05.06.2014, 08:48   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Вместо прямого вызова priceDisc.findPriceAgreement() используйте priceDisc.findPrice()

Пример использования \Data Dictionary\Maps\SalesPurchLine\Methods\setPriceAgreement
Именно этот метод используется для поиска цены при создании строки заказа через стандартный функционал.

Обратите внимание, что в стандартном функционале в случае отсутствия необходимой позиции в прайсе, будет возвращена цена, указанная на справочнике номенклатуры. За это отвечает второй параметр метода findPrice.
За это сообщение автора поблагодарили: Vasiliusis (1).
Старый 05.06.2014, 08:57   #13  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Вместо прямого вызова priceDisc.findPriceAgreement() используйте priceDisc.findPrice()

Пример использования \Data Dictionary\Maps\SalesPurchLine\Methods\setPriceAgreement
Именно этот метод используется для поиска цены при создании строки заказа через стандартный функционал.

Обратите внимание, что в стандартном функционале в случае отсутствия необходимой позиции в прайсе, будет возвращена цена, указанная на справочнике номенклатуры. За это отвечает второй параметр метода findPrice.
Сработало.
Второй параметр я думаю смысла нет использовать, все-таки тарифы в прайсе есть для каждой номенклатуры (вернее. SalesLine может быть построен в любом случае), хоть они могут быть и неправильные.
Но надо разобраться с этим отдельно...

Тут еще такая вещь интересная: для номенклатур, цены продажи у которых общие и не зависят ни от клиента, ни от конфигурации вместо числового значения в PriceDiscTable.inventDimId стоит "Axapta", а не что-то вроде "000014_031"... соответственно, в таблице inventDim для "Axapta" строк нет... Почему ставится "Axapta"?

К тому же, если для такой номенклатуры выполнить
X++:
priceDisc.findPriceAgreement(SalesLine2.priceGroupId(), 'Axapta');
строка прайса возвращается
Старый 05.06.2014, 09:03   #14  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Vasiliusis Посмотреть сообщение
Тут еще такая вещь интересная: для номенклатур, цены продажи у которых общие и не зависят ни от клиента, ни от конфигурации вместо числового значения в PriceDiscTable.inventDimId стоит "Axapta", а не что-то вроде "000014_031"... соответственно, в таблице inventDim для "Axapta" строк нет... Почему ставится "Axapta"?
Что возвращает метод InventDim::findOrCreateBlank()? Этот метод не кастомизирован? Очень странно что в таблице InventDim нет записи с таким идентификатором. Это должна быть строка со всеми пустыми значениями.
Старый 05.06.2014, 09:11   #15  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Что возвращает метод InventDim::findOrCreateBlank()? Этот метод не кастомизирован? Очень странно что в таблице InventDim нет записи с таким идентификатором. Это должна быть строка со всеми пустыми значениями.
Возвращает пустую строку, некастомизирован, никакой "Axapta" нет в InventDimId...

Если строки в InventDim нету (такое наблюдается только у номенклатур с группой "услуга" кстати), это значит что ее как бы нет на складе? что может значит это отсутсвие в InventDim?

Кстати, в SalesLine для "Axapta"-номенклатур в InventDimId ставится как раз "00014_031" и подобное... Никакой axapt'ы там не наблюдается...
Старый 05.06.2014, 09:21   #16  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Может быть кастомизация где-то ещё. Нужно отлаживать событие вставки строки в прайс. Я бы, поставил точку останова в методе PriceDiscTable.insert() и вверх по стеку вызова посмотрел бы где эта "Axapta" появляется.

Может эта "Axapta" в каких-нибудь настройках номенклатуры прописалась. Может переехала в таблицах из прошлых версий...

Последний раз редактировалось S.Kuskov; 05.06.2014 в 09:24.
Старый 05.06.2014, 09:21   #17  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Значит кастомизация где-то ещё. Нужно отлаживать событие вставки строки в прайс. Я бы, поставил точку останова в методе PriceDiscTable.insert() и вверх по стеку вызова посмотрел бы где эта "Axapta" появляется.
попробую сейчас...
Старый 05.06.2014, 09:35   #18  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Может быть кастомизация где-то ещё. Нужно отлаживать событие вставки строки в прайс. Я бы, поставил точку останова в методе PriceDiscTable.insert() и вверх по стеку вызова посмотрел бы где эта "Axapta" появляется.

Может эта "Axapta" в каких-нибудь настройках номенклатуры прописалась. Может переехала в таблицах из прошлых версий...
В таблицу уже приходит с 'Axapta', значит гдето на форме чтот есть
Старый 16.09.2014, 10:55   #19  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Если речь идет не о редактировании прайса, а о его создании. То тут ещё большие неопределённости чем с редактированием. Ведь цена может быть заведена как общая (для всех клиентов, для группы клиентов, для ценовой группы и .т.д) так и до определенной степени персональная. Какую именно цену необходимо заводить в каждом конкретном случае?
Случилось так, что нужно теперь и кастомизировать создание строки цены, для любых случаев... Как это сделать?

1. В лоб: создавать просто строку PriceDiscTable, наполнять ее данными и делать insert?
2. "Хитро": использовать классы PriceDisc, PriceDisc_Price?
Старый 16.09.2014, 11:25   #20  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Названные вами классы не создают новых строк в прайсе, а только ищут среди имеющихся.

Вот что гуглится по запросу PriceDiscTable insert
http://microsoft.public.axapta.progr...cedisc-using-x
http://www.cnblogs.com/Fandyx/archiv...5/2027655.html
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
По договору нужно периодически продавать клиенту определенный товар. Как лучше реализовать в Аксапте? mazzy DAX: Функционал 12 10.04.2009 10:38
Как реализовать маркетинговые программы Starling DAX: Функционал 0 12.02.2009 13:35
Подскажите как реализовать такой запрос в Axapte velk DAX: Программирование 12 04.04.2006 21:55
Как реализовать такую корректировку IS DAX: Функционал 7 30.04.2004 19:36
Как запретить смену компании? raz DAX: Администрирование 7 08.08.2003 12:17

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

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

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