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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.02.2012, 12:04   #1  
yahenz is offline
yahenz
Участник
 
12 / 10 (1) +
Регистрация: 27.12.2011
Адрес: Челябинск
? Сторнирование накладной в заказе на продажу
Всем привет! С аксаптой знаком недавно, так что не судите строго.

Вопрос в следующем:

Мне нужно сторнировать накладную в журнале накладных (форма CustInvoiceJournal).
Для этого у меня есть соответсвующая кнопка на форме. Когда пользователь её нажимает, то делаются некоторые проверки на возможность сторнирования, типа: существует ли заказ на продажу для выбранной накладной (таблица SalesTable по полю SalesId) и т.п.
С проверками разобрался. После них, если все в порядке, необходимо выполнить проведение сторнирующей накладной автоматически, воспроизведя стандартный алгоритм разноски как на форме "Разноска накладной" (форма SalesTable "Заказ на продажу" -> кнопка "Разноска" -> "Накладная" -> открывается форма SalesEditLines). После разноски создается накладная в таблице CustInvoiceJour.
Для разноски накладной стандартным функционалом используется класс SalesFormLetter.

Таким образом мне нужно сделать наоброт: у меня есть выбранная накладная CustInvoiceJour, по ней я нахожу заказ на продажу SalesTable, и для найденного заказа делается разноска накладной еще раз (для сторнирования).
Дак вот, как это сделать программно? Вызвать класс SalesFormLetter, что бы он отработал не выводя на экран форму "Разноска накладной". Имея курсор заказа на продажу:
X++:
salesTable = SalesTable::find(custInvoiceJour.SalesId);
Делал примерно так:
X++:
Args args = new Args();
Args formArgs = new Args();
Object objForm;
;
//Проверки...
formArgs.name(formstr(SalesTable));
objForm = ClassFactory.FormRunClass(formArgs);

args.caller(objForm);
args.record(SalesTable::find(custInvoiceJour.SalesId));
args.parmEnum(DocumentStatus::Invoice);

SalesFormLetter::main(args);
Заранее благодарю!
Старый 12.02.2012, 14:15   #2  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Example: Posting an Invoice

X++:
static void createInvoice(SalesTable _salesTable)
{
    SalesFormLetter salesFormLetter;
    ;
    salesFormLetter =
        SalesFormLetter::construct(DocumentStatus::Invoice);
    salesFormLetter.update(
        _salesTable, //SalesTable record to be posted
        systemDateGet(), //Transaction date
        SalesUpdate::All, //Which qty should be used
        AccountOrder::None,
        NoYes::No, //Is document a proforma
        NoYes::No); //Should document be printed
}
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
За это сообщение автора поблагодарили: yahenz (1).
Старый 13.02.2012, 16:53   #3  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Чтобы сделать полное сторно программным образом, надо пробежаться по всем строкам заказа, присвоить полям SalesDeliverNow и InventDeliverNow значения из сторнируемой накладной с минусом.
Далее выполнить код, приведенный Максимом Горбуновым, заменив параметр SalesUpdate::All на SalesUpdate::\DeliverNow.
За это сообщение автора поблагодарили: yahenz (1).
Старый 13.02.2012, 17:43   #4  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Кроме того, не стоит забывать про накладные расходы. А также про таблички CustVendCreditInvoicing*, в которых создаются записи для сопоставления накладных с кредит-нотами. А также про сопоставление клиентских проводок по накладной и по кредит-ноте.

Вообще, мне не очень нравится сторнировать накладные через немедленное получение (походите поиском по форуму, чтобы предысторию узнать). Я бы лучше делал через копирование заказа и разноску.

Посмотрите, как выполняется создание кредит-ноты из заказа на продажу (кнопка Функции/Создать кредит-ноту). Разделите свою задачу на две: (1) создание кредит-ноты и (2) автоматическая разноска созданной кредит-ноты.

Такая задача немного сложнее для начинающего, но зато опыта наберётесь.

Удачи.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 14.02.2012, 03:15   #5  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
Цитата:
Сообщение от Maxim Gorbunov Посмотреть сообщение
А также про таблички CustVendCreditInvoicing*, в которых создаются записи для сопоставления накладных с кредит-нотами.
А когда создаются записи в этих табличках? В описании используемого конфигурационного ключа указано, что это функционал Испании и Швеции Хоть мы и не в Испании, но этот ключ задействован, а записи в указанных таблицах отсутствуют...
Старый 14.02.2012, 11:31   #6  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Сообщение от vanokh Посмотреть сообщение
А когда создаются записи в этих табличках? В описании используемого конфигурационного ключа указано, что это функционал Испании и Швеции Хоть мы и не в Испании, но этот ключ задействован, а записи в указанных таблицах отсутствуют...
Испания и Швеция в описании возникли, видимо, потому что изначально эту функциональность придумали там. Если судить по расположению в дереве ключей, то относится Credit invoicing к Multiple countries/regions. По сути, идея функционала в том, чтобы отслеживать связь между кредит-нотой и оригинальной накладной, и печатать номера сторнированных накладных в кредит-ноте. Кроме того, связанные кредит-ноты можно найти из списка проводок по клиенту. Это в стандартном приложении, а уж как Вы будете использовать эту табличку, дело Ваше (но для репортинга она действительно иногда достаточно удобна).

В CustVendCreditInvoicingTable записи создаются при копировании строк заказа из накладной (см. SalesCopying.copy() и SalesCopying.setRefCustVendCreditInvoicingTable()). С точки зрения пользователя это происходит в тот момент, когда выполняется функция "Создать кредит-ноту" в форме Заказы на продажу, либо "Найти заказ на продажу" в форме Заказы на возврат. Потом, при разноске заказа (или возврата), создаются записи в CustVendCreditInvoicingJour (см. SalesFormLetter_Invoice.writeJournal() и SalesFormLetter_Invoice.writeCreditInvoicingJour()).

Если у Вас нет записей в этих таблицах, то, скорее всего, кредит-ноты в Вашем приложении создаются не с помощью функции "Создать кредит-ноту", а как-то по-другому (может быть, через немедленное получение, например). В принципе, нельзя сказать однозначно, что это неправильно. Просто таким образом Вы лишаете себя некоторых дополнительных возможностей, доступных в стандартном приложении.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
За это сообщение автора поблагодарили: dn (2), vanokh (1).
Старый 15.02.2012, 03:43   #7  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
Ага, посмотрел эти методы и стало все понятно - там еще завязано на галочку CreditInvoicing из CustParameters, которая у нас отключена... Кредит-ноты регулярно создаются, а из-за нее в эти таблицы ничего не попадает(
Эх, обнаружить бы раньше - а то сейчас в отчетах приходится кредит-ноты определять по лоту возврата в складских проводках...
За это сообщение автора поблагодарили: dn (2).
Старый 17.02.2012, 20:20   #8  
yahenz is offline
yahenz
Участник
 
12 / 10 (1) +
Регистрация: 27.12.2011
Адрес: Челябинск
Спасибо всем за помощь! Попробую разобраться.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Сторнирование накладной по закупке с накладными расходами. ena_ax DAX: Функционал 13 25.03.2010 22:05
Корректировка накладных расходов по накладной на продажу gene DAX: Функционал 8 09.11.2009 18:33
Сумма в проводке по скидке (в заказе на продажу) Atar DAX: Функционал 14 10.08.2007 12:16
Номер и дата накладной в Заказе ymv2000 DAX: Программирование 1 14.07.2006 13:35
Обработка накладной в заказе больше 10 минут для 200 строк sao DAX: Администрирование 23 19.10.2005 18:53

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

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

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