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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.10.2006, 17:25   #1  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Бага в стандарте
В SalesLine нашел дивный метод - используется после обработки документов по заказу - ставит в шапку минимальный статус из строк, только вот if (salesLine) никогда не отработает.. Как переписать думаю понятно кому захочется, просто времени нет..
static SalesStatus lowestSalesStatus(SalesId salesId)
{
SalesLine salesLine;
;

select minof(salesStatus) from salesLine
index hint SalesStatusIdx
where salesLine.salesId == salesId &&
salesLine.salesStatus > SalesStatus::None;

if (salesLine)
return salesLine.salesStatus;

return SalesStatus::Backorder;
}
Старый 02.10.2006, 17:33   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Да нет. В этом коде все верно.

X++:

;
box::info(enum2str(SalesLine::lowestSalesStatus('00000010_061')));






По этому заказу мне выводит статус "Отгружено".

Вас смутило, видимо, то, что выбирается только maxOf() .

if (salesLine) будет проходить иногда.
(хотя в debugger показывает recId = 0)

Видимо, это еще одно доказательство того, что следует всегда писать именно
if (salesLine) а не if (salesLine.RecId != 0)

Последний раз редактировалось kashperuk; 02.10.2006 в 17:38.
Старый 02.10.2006, 17:33   #3  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Будет выбираться? Я уменя не выбирается.. правда на другом примере проверял.. хм..

Последний раз редактировалось MironovI; 02.10.2006 в 17:40.
Старый 02.10.2006, 17:42   #4  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
фигняс, у меня recid не выбирается.. и мне это кажется весьмалогичным..
Старый 02.10.2006, 17:43   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Правильно. RecId и не выбирается.
А вот условие проходит.
Проверьте. Создайте заказ, и обработайте накладную.

На PurchLine то же самое, кстати.

Последний раз редактировалось kashperuk; 02.10.2006 в 18:01.
Старый 02.10.2006, 17:57   #6  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Видимо, это еще одно доказательство того, что следует всегда писать именно
if (salesLine) а не if (salesLine.RecId != 0)
Ну пару раз я нарывался на то, что при заполненном Recid условие if(table) проскакивало дальше. т.е. в упор не видело выбранного Recid, так что тож не факт..
Вообще это УЖОС какой-то, я перестал понимать как оно внутрях и что там себе думает..
Старый 03.10.2006, 09:02   #7  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Да все же по-моему просто.
if (table) срабатывает в true если хоть одно поле таблицы имеет значение отличное от пустого. Т.е. србатывает и здесь если поле SalesLine.salesStatus выбрано.
Условие if (table.RecId) понятно дело срабатывает когда recId != 0, т.е. либо выбрана запись в таблице полностью, либо была выборка конкретно recId, например select RecId from table...
Старый 03.10.2006, 09:09   #8  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
А если ответить в тему, то, по-моему, баг в стандартном функционале присутствует в методе: PurchCalcTax_Invoice.initCursor()
Привожу этот метод с моими исправлениями.
select nofetch forupdate vendInvoiceTrans
index hint InvoiceIdx
where vendInvoiceTrans.purchID == vendInvoiceJour.purchId &&
vendInvoiceTrans.invoiceId == vendInvoiceJour.invoiceId &&
vendInvoiceTrans.invoiceDate == vendInvoiceJour.invoiceDate &&
// STM, BugFix, 25.11.2005, kpn, -->
vendInvoiceTrans.InternalInvoiceId == vendInvoiceJour.InternalInvoiceId &&
vendInvoiceTrans.numberSequenceGroup == vendInvoiceJour.numberSequenceGroup;
// STM, BugFix, 25.11.2005, kpn, <--
}
Старый 03.10.2006, 09:47   #9  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Цитата:
Сообщение от petr Посмотреть сообщение
Да все же по-моему просто.
if (table) срабатывает в true если хоть одно поле таблицы имеет значение отличное от пустого. Т.е. србатывает и здесь если поле SalesLine.salesStatus выбрано..
Э, вот тут самое интересное - SalesStatus::None тоже значение и тоже может быть в выбрано, но по вашей терминологии оно пустое..

тоже самое select minof(salesqty) from salesLine - тоже выдаст допустим 0(ноль) - но система знает что salesLine выбрана, хотя Recid будет пустой,

а вот select minof(salesqty) from salesLine where salesLine.SalesId = 'кря_кря_нет такого заказа' - система поймет что запись не выбрана

вопрос - как?
Старый 03.10.2006, 10:26   #10  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
На этот вопрос, наверное, смогут ответить только сотрудники MS. Согласн, что по виду самой записи (все поля пустые) нельзя определить выбрана она с пустыми значениями полей или она вообще не выбрана.
Старый 03.10.2006, 11:12   #11  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Сама по себе запись - только видимая часть айсберга.

Не забывайте, табличная переменная может быть как связана с результатом выбоки, так и нет.

Если не связана, то, на сколько я понимаю, проверка курсора эквивилентна проверке на RecId (если даже заполнить другие поля, короме RecId, то проверка не пройдет).

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

Есть еще один момент - если в результате выбоки не была получена ни одна запись, то табличная переменная получается не связанная (если изменить recId, то проверка пройдет успешно).

Вообще, вывод из этого - проверяйте табличную переменную,а не RecId
__________________
Axapta v.3.0 sp5 kr2
Старый 03.10.2006, 12:12   #12  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Цитата:
Сообщение от petr Посмотреть сообщение
А если ответить в тему, то, по-моему, баг в стандартном функционале присутствует в методе: PurchCalcTax_Invoice.initCursor()
Привожу этот метод с моими исправлениями.
select nofetch forupdate vendInvoiceTrans
index hint InvoiceIdx
where vendInvoiceTrans.purchID == vendInvoiceJour.purchId &&
vendInvoiceTrans.invoiceId == vendInvoiceJour.invoiceId &&
vendInvoiceTrans.invoiceDate == vendInvoiceJour.invoiceDate &&
// STM, BugFix, 25.11.2005, kpn, -->
vendInvoiceTrans.InternalInvoiceId == vendInvoiceJour.InternalInvoiceId &&
vendInvoiceTrans.numberSequenceGroup == vendInvoiceJour.numberSequenceGroup;
// STM, BugFix, 25.11.2005, kpn, <--
}

Вот какие бывают совпадения, сегодня поймал аналогичную багу в SalesCalcTax_Invoice\initCursor и впомнил про этот пост Правда поймать ее имеют шанс далеко не все - те кто обрабатывают накладные с одинаковыми номерами но с разными группами номерных серий

void initCursor()
{;
select nofetch forupdate custInvoiceTrans
index hint InvoiceIdx
where custInvoiceTrans.salesId == custInvoiceJour.salesId &&
custInvoiceTrans.invoiceId == custInvoiceJour.invoiceId &&
custInvoiceTrans.invoiceDate == custInvoiceJour.invoiceDate &&
// фикса, imir, 03.10.06 -->
custInvoiceTrans.numberSequenceGroup == custInvoiceJour.numberSequenceGroup;
// фикса, imir, 03.10.06 <--
}

Последний раз редактировалось MironovI; 03.10.2006 в 12:23.
Старый 04.10.2006, 10:26   #13  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
А интересно зафиксирован ли этот баг в MS. Ведь исправить - плевое дело. Может правда он уже исправлен в свежих SP?
В принципе этот баг мало на что влияет. Я наткнулся на него, когда стал делать отчет по строкам накладных поставщиков и увидел неправильные сумма НДС.
Старый 04.10.2006, 10:46   #14  
NetBus is offline
NetBus
Участник
 
200 / 85 (3) ++++
Регистрация: 08.07.2005
Адрес: Москва
Цитата:
Сообщение от petr Посмотреть сообщение
Может правда он уже исправлен в свежих SP?
По крайне мере в Axapta 3.0 sp4 исправлено
PHP код:
void  initCursor()
{;
    
select nofetch forupdate vendInvoiceTrans
        index hint InvoiceIdx
        where vendInvoiceTrans
.purchID             == vendInvoiceJour.purchId             &&
              
vendInvoiceTrans.invoiceId           == vendInvoiceJour.invoiceId           &&
              
vendInvoiceTrans.InternalInvoiceId   == vendInvoiceJour.InternalInvoiceId   &&
              
vendInvoiceTrans.numberSequenceGroup == vendInvoiceJour.numberSequenceGroup &&
              
vendInvoiceTrans.invoiceDate         == vendInvoiceJour.invoiceDate;

За это сообщение автора поблагодарили: petr (1).
Старый 04.10.2006, 12:00   #15  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
На SP3 точно нет
Старый 04.10.2006, 13:15   #16  
36AC is offline
36AC
Участник
Аватар для 36AC
 
28 / 11 (1) +
Регистрация: 30.06.2005
Адрес: город М
у нас ax 3.0 sp3 cu1
PHP код:
void  initCursor()
{;
    
select nofetch forupdate vendInvoiceTrans
        index hint InvoiceIdx
        where vendInvoiceTrans
.purchID             == vendInvoiceJour.purchId             &&
              
vendInvoiceTrans.invoiceId           == vendInvoiceJour.invoiceId           &&
              
vendInvoiceTrans.InternalInvoiceId   == vendInvoiceJour.InternalInvoiceId   &&
              
vendInvoiceTrans.numberSequenceGroup == vendInvoiceJour.numberSequenceGroup &&
              
vendInvoiceTrans.invoiceDate         == vendInvoiceJour.invoiceDate;

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Бага в сопоставлении «Максимальная переплата или недоплата». Starling DAX: Функционал 1 03.04.2009 17:16
RAssetParameters - бага Logger DAX: Программирование 0 25.07.2007 12:00
Бага в View MironovI DAX: Программирование 1 10.03.2006 13:11
Бага или фича в модуле Расчеты с персоналом? katja DAX: Функционал 3 13.09.2004 18:10
БАГА: Модификаторы методов Антон Солдатов DAX: Программирование 3 02.07.2003 05:19

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

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

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