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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.12.2008, 07:11   #1  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
Lightbulb Ну уже не знаю что и как делать ((
Уважаемы гуру, прошу посмотрите код. Что в нем не так. Ну ни как не могу скорректировать налог ((. Выдает ошибку и все тут .



X++:
switch (rDeferralsJournalTrans.DocumentStatus)
    {
        case DocumentStatus::Invoice :
             purchFormLetter = PurchFormLetter::construct(DocumentStatus::Invoice);
             break;
        case DocumentStatus::Facture_RU :
             purchFormLetter = PurchFormLetter::construct(DocumentStatus::Facture_RU);
             break;
    }
    purchFormLetter.specQty(PurchUpdate::ReceiveNow);
    purchParmTable.clear();
    purchFormLetter.createParmTable(purchParmTable,purchTable);
    purchParmTable.ParmId = purchFormLetter.parmId();
    purchParmTable.TransDate = systemDateGet();
    purchParmTable.DocumentDate = systemDateGet();
    purchParmTable.Num = rDeferralsJournalTrans.DocumentNum;
    purchParmTable.FactureExternalId_RU = rDeferralsJournalTrans.DocumentNum;
    purchParmTable.insert();
    purchFormLetter.createParmLine(purchLine);
    ttsbegin;
    select forupdate * from purchParmLine
        where purchParmLine.OrigPurchId==rDeferralsJournalTrans.PurchId &&
              purchParmLine.ParmId==purchFormLetter.parmId();
 
    purchParmLine.initFromPurchLine(purchLine);
    purchParmLine.initFromParmTable(purchParmTable);
    purchParmLine.LineAmount=rDeferralsJournalTrans.AmountCur;
    purchParmLine.update();
    ttscommit;
    purchFormLetter.createParmUpdate();
    purchParmUpdate = purchFormLetter.purchParmUpdate();
    purchParmUpdate.SumBy = AccountOrder::None;
    purchParmUpdate.SpecQty = purchFormLetter.specQty();
    purchParmUpdate.DocumentStatus = purchFormLetter.documentStatus();
    purchParmUpdate.update();
 
    purchFormLetter.purchParmUpdate(purchParmUpdate);
    purchTotals = PurchTotals::construct(purchTable,
                                         PurchUpdate::ReceiveNow,
                                         AccountOrder::None,
                                         purchFormLetter.parmId(),
                                         purchTable.PurchId,
                                         purchFormLetter.documentStatus());
    purchTotals.calc();
    taxRegulation = TaxRegulation::newTaxRegulation(purchTotals.tax());
    taxRegulation.allocateAmount(rDeferralsJournalTrans.TaxAmount);
    taxRegulation.saveTaxRegulation();
    purchFormLetter.initParameters(purchParmUpdate,PrintOut::Current,NoYes::No,NoYes::No,NoYes::No);
    purchFormLetter.run();
Миниатюры
Нажмите на изображение для увеличения
Название: taxerror.jpg
Просмотров: 456
Размер:	54.1 Кб
ID:	4094  
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
Старый 23.12.2008, 10:02   #2  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2155 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
А в выборку попадает несколько закупок? Такая ошибка происходит когда обрабатывается несколько закупок и есть коррекция налога на одной из них. Если делать "руками" в интерфейсе, то ДО коррекции налогов нужно нажать кнопку "Упорядочить" в форме обработка накладной и после этого делать коррекцию. Может, в коде нужно явно вызвать упорядочивание?
__________________
Ivanhoe as is..
За это сообщение автора поблагодарили: alex55 (1).
Старый 23.12.2008, 10:56   #3  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
А в выборку попадает несколько закупок? Такая ошибка происходит когда обрабатывается несколько закупок и есть коррекция налога на одной из них. Если делать "руками" в интерфейсе, то ДО коррекции налогов нужно нажать кнопку "Упорядочить" в форме обработка накладной и после этого делать коррекцию. Может, в коде нужно явно вызвать упорядочивание?
Да нет, не похоже...
К тому же судя по коду там одна закупка, более того - одна строка по закупке, в накладной.
Вопрос даже скорее по функционалу налогов, чем по программированию.
__________________
Zhirenkov Vitaly
Старый 23.12.2008, 11:00   #4  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
если вызвать purchFormLetter.Prompt() то все срабатывает ((, но мне не надо вызывать эту форму
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
Старый 23.12.2008, 11:17   #5  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от kalex_a Посмотреть сообщение
если вызвать purchFormLetter.Prompt() то все срабатывает ((, но мне не надо вызывать эту форму
Как вариант:

Ставите брейкпоинт на info.add(), либо ищете где используется метка по вашему сообщению.
Находите нужное место, откуда идёт данное сообщение.
Проясняете для себя причины, почему оно возникает.
Ищете код, который эти причины устраняет (вероятно в стеке prompt() что-то с этим делается).
Копируете в свой код.
__________________
Zhirenkov Vitaly
Старый 23.12.2008, 11:24   #6  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
В промпте вроде как вызывается метод initLinesQuery(), где заполняются parmTable parmLine и иже с ними. Я бы не стал создавать эти таблы руками и тем более апдейтить их потом. Вместо промпта вызовите ряд методов, которые в нем вызываются и добавьте какой нить параметр типа showdialog, чтоб вызывать purcheditLines или нет. По умолчанию естественно он должен быть true. выже в свой парм метод передавайте false. Возможно этот способ Вам не поможет, но будет более правильным на мой взгляд.
Старый 23.12.2008, 11:27   #7  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Что то вроде
X++:
salesFormLetter = SalesFormLetter::construct(DocumentStatus::Invoice);
        parmId          = salesFormLetter.parmId();
        salesFormLetter.salesTable(salesTable);
        salesFormLetter.getLast();
        salesFormLetter.parmId(parmId);
        salesFormLetter.transDate(salesTable.InvoiceDate);
        salesFormLetter.specQty(SalesUpdate::All);
        salesFormLetter.createParmUpdate();
        salesFormLetter.createParmTable(salesParmTable, salesTable);
        salesFormLetter.initLinesQuery();
        salesFormLetter.run();
Нашол у себя в приложении кусок кода. Для примера. ЗЫ: Плюс передайте свои параметры дополнительно и может что получится.

Последний раз редактировалось Sada; 23.12.2008 в 11:31.
Старый 23.12.2008, 11:34   #8  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
в методе purchFormLetter.run() есть строка
X++:
 if (reArrangeNow)
        this.reArrange(false, false);
так вот переменная reArrangeNow имеет значение "true" соответственно выполняется метод this.reArrange(false, false); где выходит на ошибку
X++:
if (!this.checkTaxWorkRegulation())
        throw error("@SYS21628");
, а если разносить через форму заказа ("Разноска" -> "Накладная" и т.д.) то она имеет значение "False".
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
Старый 23.12.2008, 11:40   #9  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
\Classes\FormLetter\reArrangeNow
поставьте тут точку останова
Старый 23.12.2008, 11:41   #10  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от kalex_a Посмотреть сообщение
в методе purchFormLetter.run() есть строка
X++:
 if (reArrangeNow)
        this.reArrange(false, false);
так вот переменная reArrangeNow имеет значение "true" соответственно выполняется метод this.reArrange(false, false); где выходит на ошибку
X++:
if (!this.checkTaxWorkRegulation())
        throw error("@SYS21628");
, а если разносить через форму заказа ("Разноска" -> "Накладная" и т.д.) то она имеет значение "False".
Ну вот вы и нашли ответ.
Вероятно, метод purchFormLetter.reArrangeNow(false) перед run вам должен помочь.
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: kalex_a (1).
Старый 23.12.2008, 11:42   #11  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Цитата:
Сообщение от ZVV Посмотреть сообщение
Ну вот вы и нашли ответ.
Вероятно, метод purchFormLetter.reArrangeNow(false) перед run вам должен помочь.
не не не. Помоему так низя. Нада посмотреть почему при стандартной оброботке эта переменная false
Старый 23.12.2008, 11:50   #12  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
Цитата:
Сообщение от ZVV Посмотреть сообщение
Ну вот вы и нашли ответ.
Вероятно, метод purchFormLetter.reArrangeNow(false) перед run вам должен помочь.
Странно, раньше не работало. Сейчас сработало .

Спасибо ZVV
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
Старый 23.12.2008, 11:58   #13  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
В методе reArrange выполняется ацкое количество кода Может он там зачем то нужен
Старый 23.12.2008, 12:04   #14  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2155 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Может, в настройках модуля РП стоит Суммарная обработка = Нет, и этот параметр автоматически подтягивается в форму обработки накладной. А когда вы делаете все из кода, то не прописываете, что суммарной обработки не будет, вот и ошибка.
__________________
Ivanhoe as is..
Старый 23.12.2008, 12:06   #15  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
Цитата:
Сообщение от Sada Посмотреть сообщение
В методе reArrange выполняется ацкое количество кода Может он там зачем то нужен
Согласен, как я понял ( по моим раскопкам ), он выполняется когда "Суммарная обработка" не равно "Нет", а т.к. у меня всегда равно "Нет", то мне он не нужен
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
Старый 23.12.2008, 12:08   #16  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
Может, в настройках модуля РП стоит Суммарная обработка = Нет, и этот параметр автоматически подтягивается в форму обработки накладной. А когда вы делаете все из кода, то не прописываете, что суммарной обработки не будет, вот и ошибка.
Вы правы, хотя я в передаю параметр
X++:
purchParmUpdate.SumBy = AccountOrder::None;
но такое чуство что он его не видит
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
Старый 23.12.2008, 12:45   #17  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2155 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Эх, залезаем в код

В методе init формы обработки есть строки:

X++:
sumBy.selection(purchEditLinesForm.sumBy());
    element.sumByChanged(true);
Первая задает значение параметра SumBy. Вы явно делаете
X++:
purchParmUpdate.SumBy = AccountOrder::None;
, т.е. аналогично.

Но во второй строке запускается метод в котором:

X++:
if (_init && purchParmUpdate.SumBy == AccountOrder::None)
        reArrangeNow = false;
т.е. еще явно задается reArrangeNow = false.

Так что совет ZVV абсолютно точен.
__________________
Ivanhoe as is..
Старый 23.12.2008, 13:21   #18  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Цитата:
Сообщение от Ivanhoe
Может, в настройках модуля РП стоит Суммарная обработка = Нет, и этот параметр автоматически подтягивается в форму обработки накладной.
Цитата:
Сообщение от kalex_a Посмотреть сообщение
Вы правы, хотя я в передаю параметр
X++:
purchParmUpdate.SumBy = AccountOrder::None;
но такое чуство что он его не видит
'Программно' функционал класса purchFormLetter это действительно 'не видит' по причине того что часть логики отночительно значения reArrangeNow отрабатывает непосредственно на форме PurchEditLines и значение reArrangeNow передается в класс в качестве параметра (в методе new() класса PurchFormLetter reArrangeNow инициализируется значением true).

Цитата:
Сообщение от Sada
...
Нада посмотреть почему при стандартной оброботке эта переменная false
Можно отследить что происходит при работе с формой PurchEditLines при вызове purchFormLetter.prompt() в части работы с параметром reArrangeNow :

Forms\PurchEditLines\init():
X++:
...
sumBy.selection(purchEditLinesForm.sumBy());
element.sumByChanged(true);
...
метод purchEditLinesForm.sumBy():
X++:
AccountOrder  sumBy()
{;
    return PurchParameters::find().SummaryUpdateBy;
}
возвращает значение из параметров модуля "Рачеты с поставщиками". (В Вашем случае получается что "Суммарная обработка" = Нет)

Forms\PurchEditLines\sumByChanged():
X++:
void  sumByChanged(boolean _init)
{
...
if (_init && purchParmUpdate.SumBy == AccountOrder::None)
    reArrangeNow = false;
else
    reArrangeNow = true;

buttonReArrange.enabled(reArrangeNow);
...
}
На входе метода параметр _init = true, после открытия формы переменная reArrangeNow = false (визуально кнопка "Упорядочить" при этом недоступна). Если параметр "Суммарная обработка" не трогать, то при закрытии формы:
X++:
void  closeOk()
{
...
purchFormLetter.reArrangeNow(reArrangeNow);
...
}
значение false уходит в класс purchFormLetter, что Вы и констатировали:
Цитата:
Сообщение от kalex_a
, а если разносить через форму заказа ("Разноска" -> "Накладная" и т.д.) то она имеет значение "False".
При таком раскладе конструкция:
X++:
purchFormLetter.reArrangeNow(false);
...
purchParmUpdate.SumBy = AccountOrder::None;
вполне укладывается в штатное поведение Ax, imho

P.S. Oops... пока излагал свою мысль Ivanhoe уже ответил в тему.

Последний раз редактировалось petergunn; 23.12.2008 в 13:26. Причина: Похожее содержание ответа
Теги
закупка, коррекция налогов, налоги, программно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Курсор перешел к следующей записи на клиенте, на сервере этого сделать уже нельзя PavelSR DAX: Программирование 22 01.11.2012 07:33
Ступор с простейшим запросом. Что-то я не знаю... vvk DAX: Программирование 5 12.02.2008 19:37
Частичный возврат по позиции отгруженой в уже закрытый период... Dronas DAX: Программирование 0 02.08.2007 11:10
Принеси то, не знаю что... Smith DAX: Программирование 5 06.06.2005 17:07
"Такая строка уже сущ." при переносе из Excel! Zelenhof DAX: Программирование 2 13.01.2003 13:41

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

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

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