AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 04.03.2003, 12:53   #1  
Андре ist offline
Андре
Moderator
Сотрудники компании GMCS
 
2.375 / 464 (20) +++++++
Registriert seit: 03.12.2001
LineNum
Добрый день.

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

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

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

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


Заранее благодарю.
Alt 04.03.2003, 12:58   #2  
Wamr ist offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1.737 / 868 (32) +++++++
Registriert seit: 15.01.2002
Ort: Москва
Blog-Einträge: 7
SalesLine.createLine(...)
---- добавлено -------
А чем тебя не устраивает алгоритм создания LineNum?
Alt 04.03.2003, 13:49   #3  
Андре ist offline
Андре
Moderator
Сотрудники компании GMCS
 
2.375 / 464 (20) +++++++
Registriert seit: 03.12.2001
Zitat:
SalesLine.createLine(...)
Это ты мне даешь рецепт, а не причину

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

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

PHP-Code:
   // [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.

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

Что посоветуете ?
Alt 04.03.2003, 14:01   #4  
Wamr ist offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1.737 / 868 (32) +++++++
Registriert seit: 15.01.2002
Ort: Москва
Blog-Einträge: 7
Мне кажется, можно просто сделать lineNum ++ какой-дь, так как изначальная его идея сохранять порядок строк в форме.
А метод, действительно, недоступен... видимо, он является неотъемлемой частью FormDataSource и связан со свойством CounterField
Alt 04.03.2003, 14:51   #5  
Андре ist offline
Андре
Moderator
Сотрудники компании GMCS
 
2.375 / 464 (20) +++++++
Registriert seit: 03.12.2001
Zitat:
А метод, действительно, недоступен... видимо, он является неотъемлемой частью FormDataSource и связан со свойством CounterField
ОК. Спасибо. Похоже мои предположения подтверждаются.
Alt 04.03.2003, 19:13   #6  
mazzy ist offline
mazzy
Участник
Benutzerbild von mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29.472 / 4494 (208) ++++++++++
Registriert seit: 29.11.2001
Ort: Москва
Blog-Einträge: 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.
Alt 04.03.2003, 19:28   #7  
Андре ist offline
Андре
Moderator
Сотрудники компании GMCS
 
2.375 / 464 (20) +++++++
Registriert seit: 03.12.2001
Еще раз спасибо. Подозрения переросли в уверенность.
Alt 04.03.2003, 19:40   #8  
Vadik ist offline
Vadik
Модератор
Benutzerbild von Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3.631 / 1853 (69) ++++++++
Registriert seit: 18.11.2002
Ort: гражданин Москвы
Zitat:
This is used for example in the CustWorksh in the standard application
Это что за зверь? Никакого CustWorksh у меня в 25SP5 не наблюдается
Alt 25.08.2005, 17:20   #9  
novic ist offline
novic
Axapta Retail User
Axapta Retail User
 
168 / 25 (0) +++
Registriert seit: 14.04.2005
Так у кого-нить есть ясность по поводу формирования LineNum в InventJournalTrans? Будьте любезны, поделитесь
Alt 25.08.2005, 17:28   #10  
DreamCreator ist offline
DreamCreator
Moderator
Benutzerbild von DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Registriert seit: 04.11.2004
Ort: Казань
Я мож чего не понял, но почему бы не воспользоваться простым методом:

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

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

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

Zitat:
Zitat von mazzy Beitrag anzeigen
Скорее всего, 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 округления не было.
Zitat:
Zitat von mazzy Beitrag anzeigen
Скорее всего, причина бага в другом.
После того как job-ом сделали уникальным LineNum в рамках ParentRecId, проблема исчезла.
Alt 18.03.2016, 11:31   #19  
Sergey Petrov ist offline
Sergey Petrov
Участник
 
80 / 19 (1) ++
Registriert seit: 03.04.2007
Ort: Saint-Petersburg, Russia
Коллеги, добрый день! Возможно, кому-то будет интересно. При разборе собственных авгиевых конюшен, столкнулись со следующим эффектом (воспроизводится на DAX2009, в частности):

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

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

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

Kernel 5.0.1600.4110
Application 5.0.1500.6491
This post has been rated by: mazzy (2).
Alt 18.03.2016, 16:13   #20  
Владимир Максимов ist offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1.726 / 1208 (44) ++++++++
Registriert seit: 13.01.2004
Blog-Einträge: 3
Zitat:
Zitat von Sergey Petrov Beitrag anzeigen
если в форме с заказами несколько раз создать строки без сохранения данных в БД, то нумерация таких (не сохранённых) строк правильная. Срабатывает свойство CounterField на источнике данных SalesLine.
Не оно?

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

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

X++:
this.forceWrite(true)

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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Оптимизация запроса - 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

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 02:32 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.