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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.03.2003, 12:53   #1  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
LineNum
Добрый день.

Есть такие таблицы, как InventJournalTrans, SalesLine. У них есть поле LineNum, которое заполняется по довольно интересному алгоритму.

Возьмем одну таблицу InventJournalTrans, а точнее форму с аналогичным названием. При создании строк lineNum автоматически формируется. А вот где это происходит ???

Беглый поиск по исходному коду ничего не дал. Но зато, на датасоурсе в той же форме InventJournalTrans я нашел свойство counterField = LineNum. И что-то у меня закралось подозрение, что кода формирующего lineNum я не увижу, так как этот код прописан глубоко в ядре, а все чем я могу играться это тот самы counterField.

Это так или нет ? Если я прав, как пользоваться этим counterField ? Если нет, где этот код ?


Заранее благодарю.
Старый 04.03.2003, 12:58   #2  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
SalesLine.createLine(...)
---- добавлено -------
А чем тебя не устраивает алгоритм создания LineNum?
Старый 04.03.2003, 13:49   #3  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
SalesLine.createLine(...)
Это ты мне даешь рецепт, а не причину

К тому же я работаю с InventJournalTrans, а там нет такого замечательного метода, как createLine().

Цитата:
А чем тебя не устраивает алгоритм создания LineNum?
Задача такая - в коде программы создавать строки журнала.

PHP код:
   // [from IJT.initValue() (frm)]
    
inventJournalTrans.initFromInventJournalTable(inventJournalTable);
    
inventJournalTrans.journalType InventJournalType::LossProfit;
    
// [from IJT.initValue() (tbl)]
    
inventJournalTrans.TransDate systemdateGet();
    
// [from IJT.itemId.modified() (frm)]
    
inventJournalTrans.ItemId '0-0401À';
    
inventJournalTrans.ConfigId '1';
    
inventJournalTrans.inventMovement().journalSetItemId(inventDim);
    
inventDim.initFromInventTable(inventJournalTrans.inventMovement().inventTable());
    
inventJournalTrans.insert(); 
Тут еще много чего не доделано, но основной недостаток - не генерится LineNum.

Можно конечно самому последовательно нумеровать, но я думал найти метод, где это делается и вызывать его из своего кода. Отсюда и вопрос.

Что посоветуете ?
Старый 04.03.2003, 14:01   #4  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Мне кажется, можно просто сделать lineNum ++ какой-дь, так как изначальная его идея сохранять порядок строк в форме.
А метод, действительно, недоступен... видимо, он является неотъемлемой частью FormDataSource и связан со свойством CounterField
Старый 04.03.2003, 14:51   #5  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
А метод, действительно, недоступен... видимо, он является неотъемлемой частью FormDataSource и связан со свойством CounterField
ОК. Спасибо. Похоже мои предположения подтверждаются.
Старый 04.03.2003, 19:13   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Best Practice http://technet.navision.com/usered/B...ata_source.htm

A CounterField is typically used to ensure that a record inserted in a form is given a line number that corresponds to the actual, sequential position in the form.

For example, if a new line is inserted between lines 3 and 4, the new line is given line number 3,5. This is used for example in the CustWorksh in the standard application.

To achieve this effect the field given as CounterField should be given as index on the database table.
Старый 04.03.2003, 19:28   #7  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Еще раз спасибо. Подозрения переросли в уверенность.
Старый 04.03.2003, 19:40   #8  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
This is used for example in the CustWorksh in the standard application
Это что за зверь? Никакого CustWorksh у меня в 25SP5 не наблюдается
Старый 25.08.2005, 17:20   #9  
novic is offline
novic
Axapta Retail User
Axapta Retail User
 
168 / 25 (0) +++
Регистрация: 14.04.2005
Так у кого-нить есть ясность по поводу формирования LineNum в InventJournalTrans? Будьте любезны, поделитесь
Старый 25.08.2005, 17:28   #10  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Я мож чего не понял, но почему бы не воспользоваться простым методом:

PHP код:
inventJournalTrans.LineNum InventJournalTrans::lastLineNum(journalId) + 1
Старый 25.08.2005, 17:33   #11  
novic is offline
novic
Axapta Retail User
Axapta Retail User
 
168 / 25 (0) +++
Регистрация: 14.04.2005
Простой метод хорош! но не всегда -)
Этот пост родился из предыдущей темы - http://www.axforum.info/forums/showt...7960#post77960
Если скопировать сначала строку ( без записи) , а после создать новую - при +1 вылетает ошибка, при + 0.5 - через 2 строки ошибка.
Старый 25.08.2005, 17:42   #12  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
А если так:

[Ваш код]
PHP код:
        CopyLine::copyJournalLine(InventJournalTrans,i); 
где i - итератор в приведенном в начале топика http://www.axforum.info/forums/showt...7960#post77960 цикле.

А в методе copyJournalLine
PHP код:
inventJournalTrans.LineNum InventJournalTrans::lastLineNum(journalId) + _i
где _i переданный фактический параметр i.
Старый 25.08.2005, 18:47   #13  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Может сделать так?
http://www.axforum.info/forums/showt...7993#post77993
Старый 31.08.2005, 10:19   #14  
Paul_ST is offline
Paul_ST
Участник
 
144 / 11 (1) +
Регистрация: 26.11.2003
Адрес: Екатеринбург
я создавал складские журналы программно и не сталкивался с обсуждаемой проблемой, поскольку использовал: InventJournalTrans.insertFromCode()
__________________
Paul_ST
Старый 25.06.2007, 19:30   #15  
Starling is offline
Starling
Участник
Дети Юза
 
530 / 76 (4) ++++
Регистрация: 20.10.2005
Адрес: Kiev
Наступил на вот такие грабли:
В DS формы свойство CounterField установлено как LineNum. Строк в документе 760. В результате «хитрого» стечения обстоятельств часть строк получили одинаковый LineNum. Это в свою очередь привело к тому, что при разноске документа, у меня пошли некорректные суммы.
Прогнал job и сделал уникальным LineNum для этого документа, суммы сошлись.
Приложение сильно модифицированное, но что-то мне кажется, что при таких раскладах и в стандарте была бы ошибка.
Кто-то еще сталкивался с такой проблемой?
Старый 26.06.2007, 09:35   #16  
zinius is offline
zinius
Участник
 
24 / 11 (1) +
Регистрация: 26.01.2005
Как они могут получить одинаковый LineNum? ведь первичный ключ должен закрывать эту возможность - JournalNum, LineNum
Старый 26.06.2007, 09:38   #17  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Starling Посмотреть сообщение
часть строк получили одинаковый LineNum.
Цитата:
Сообщение от zinius Посмотреть сообщение
Как они могут получить одинаковый LineNum? ведь первичный ключ должен закрывать эту возможность - JournalNum, LineNum
Скорее всего, LineNum там все-таки разный, но отличается в пятом-шестом-седьмом знаках. Аксапта показывает округленные значения. Но на сравнение все равно влияют все значящие цифры. Скорее всего, причина бага в другом.
__________________
полезное на axForum, github, vk, coub.
Старый 26.06.2007, 10:51   #18  
Starling is offline
Starling
Участник
Дети Юза
 
530 / 76 (4) ++++
Регистрация: 20.10.2005
Адрес: Kiev
Цитата:
Сообщение от zinius Посмотреть сообщение
Как они могут получить одинаковый LineNum? ведь первичный ключ должен закрывать эту возможность - JournalNum, LineNum
Могут. Форма CustFreeInvoice. Таблица CustInvoiceLine. Индекс ParentRecIdIdx AllowDuplicate = Yes. Других индексов нет.

Цитата:
Сообщение от mazzy Посмотреть сообщение
Скорее всего, LineNum там все-таки разный, но отличается в пятом-шестом-седьмом знаках. Аксапта показывает округленные значения. Но на сравнение все равно влияют все значящие цифры. Скорее всего, причина бага в другом.
Они были одинаковыми. Вот такой Job
X++:
static void Job157(Args _args)
{
    CustInvoiceLine custInvoiceLine;
    ;
    while select count(ReciD) from custInvoiceLine index hint ParentRecIdIdx group by LineNum
        where custInvoiceLine.ParentRecId == 8484848
    {
        if(custInvoiceLine.RecId > 1)
            warning(strFmt("%1", custInvoiceLine.RecId));
    }

}
Выдавал 2, 3, 7, я думаю в данном случае при group by округления не было.
Цитата:
Сообщение от mazzy Посмотреть сообщение
Скорее всего, причина бага в другом.
После того как job-ом сделали уникальным LineNum в рамках ParentRecId, проблема исчезла.
Старый 18.03.2016, 11:31   #19  
Sergey Petrov is offline
Sergey Petrov
Участник
 
80 / 19 (1) ++
Регистрация: 03.04.2007
Адрес: Saint-Petersburg, Russia
Коллеги, добрый день! Возможно, кому-то будет интересно. При разборе собственных авгиевых конюшен, столкнулись со следующим эффектом (воспроизводится на DAX2009, в частности):

если в форме с заказами несколько раз создать строки без сохранения данных в БД, то нумерация таких (не сохранённых) строк правильная. Срабатывает свойство CounterField на источнике данных SalesLine.

Далее, начинаем прописывать код номенклатуры и пр. в созданные "болванки", сохраняем строки в БД. При этом видим: номер строки во всех создаваемых строках равен максимальному номеру строки созданного нами массива "болванок". В результате получаем строки с одинаковыми номерами. Причём, уникальный индекс, который содержит SalesLine.LineNum (SalesLineIdx) позволяет такую штуку, поскольку в него входит ещё и RecId.

Может быть, кто-нибудь знает, как этот момент красиво обойти?
__________________
MS Dynamics AX 2009

Kernel 5.0.1600.4110
Application 5.0.1500.6491
За это сообщение автора поблагодарили: mazzy (2).
Старый 18.03.2016, 16:13   #20  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Sergey Petrov Посмотреть сообщение
если в форме с заказами несколько раз создать строки без сохранения данных в БД, то нумерация таких (не сохранённых) строк правильная. Срабатывает свойство CounterField на источнике данных SalesLine.
Не оно?

Запись не сохраняется при переходе на другую в гриде

Т.е. в метод Create() на SalesLine в источнике данных формы в конце после super() добавить команду

X++:
this.forceWrite(true)

Правда, тогда невозможно будет делать болванки без сохранения
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Sergey Petrov (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Оптимизация запроса - ranges kashperuk DAX: Программирование 13 31.01.2011 20:19
C# and AX Development: Truncated real fields (ex. LineNum) when table is exported as XML Blog bot DAX Blogs 0 07.02.2009 11:05
Дублирование LineNum в строках журналов tvn DAX: Программирование 5 18.05.2006 18:32
LineNum < 0 Александр Костоусов DAX: Программирование 1 27.09.2004 16:39
Почему в InventJournalTrans поле linenum вещественного типа?! ATimTim DAX: Программирование 7 17.06.2004 17:35

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

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

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