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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.09.2010, 14:46   #1  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
? Lookup по полю типа Guid
Есть таблица1, там первое поле типа Guid. По этому полю кластерный индекс.
Создана форма1 по этой таблице1.
Поле на основе Guid это EDT c relations на таблицу1.

В таблице2, создано поле по EDT Guid из таблицы1.
Открываю форму2 выбираю lookup по этому полю.
При повторном выборе lookup, курсор не становится на нужную строку с известным guid.

Переход к основной таблице тоже автоматически не ставить курсор в гриде. (На форме1 в DataSource индекс проставлен по таблице1)

Почему так происходит? Почему по guid не перемещается курсор?
Это как то связано с guid? По остальным вариантам, если поле не типа guid, курсор нормально.
__________________

This posting is provided "AS IS" with no warranties, and confers no rights.

Последний раз редактировалось Poleax; 28.09.2010 в 14:49.
Старый 28.09.2010, 15:15   #2  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Poleax, а что значит курсор не перемещается по GUID? Можешь скрин выложить?
Старый 28.09.2010, 15:27   #3  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Маленький проект для примера Вложение 6194

Имеем Form1. Строки создаются просто Ctrl+N Guid автоматом генерится.
Название: 1.png
Просмотров: 2239

Размер: 54.8 Кб

Получаем странный lookup. Курсор в гриде лукапа не на месте.
Form2
Название: 2.png
Просмотров: 2088

Размер: 49.7 Кб

Проект \Projects\Shared\Project_GuidLookup состоит из:
\Data Dictionary\Tables\Table1
\Data Dictionary\Tables\Table2
\Data Dictionary\Extended Data Types\testGuid
\Forms\Form1
\Forms\Form2
\Menu Items\Display\Table1
__________________

This posting is provided "AS IS" with no warranties, and confers no rights.

Последний раз редактировалось Poleax; 06.12.2010 в 13:39.
Старый 28.09.2010, 16:12   #4  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Стал перекрывать лукап программно, либо я что-то не так делаю, либо в аксапте не предусмотрено перекрытие лукапа для контролов типа Guid. Открыл класс SysTableLookup, метод performFormLookup():
X++:
void performFormLookup()
{
    FormStringControl   callingStringControl;
    FormIntControl      callingIntControl;
    FormInt64Control    callingInt64Control;
    FormDateControl     callingDateControl;
    FormGuidControl     callingGuidControl; // добавил новый вид контрола, его почему-то не было
    if (!callingControl)
        throw(error(Error::wrongUseOfFunction(funcname())));

    switch (callingControl.handle())
    {
        case classnum(FormStringControl):
            callingStringControl = callingControl;
            callingStringControl.performFormLookup(this.formRun());
            break;
        case classnum(FormIntControl):
            callingIntControl = callingControl;
            callingIntControl.performFormLookup(this.formRun());
            break;
        case classnum(FormInt64Control):
            callingInt64Control = callingControl;
            callingInt64Control.performFormLookup(this.formRun());
            break;
        case classnum(FormDateControl):
            callingDateControl = callingControl;
            callingDateControl.performFormLookup(this.formRun());
            break;
        // без этого изменения лукап не работает (перекрытый) -->
        case classnum(FormGuidControl):
            callingGuidControl = callingControl;
            callingGuidControl.performFormLookup(this.formRun());
            break;
        // без этого изменения лукап не работает (перекрытый) <--
    }
}
Теперь не могу сообразить, как же работает стандартный лукап по EDT с типом Guid, и почему под это не приспособлен такой вариант лукапа?
Старый 28.09.2010, 16:32   #5  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Lightbulb
Судя по всему лукап по полю с типом Guid работает без позиционирования на текущем выбранном элементе. Можно выбрать другое решение, чтобы не дописывать стандартные классы - перекрыть лукап по какому-нибудь другому полю, тоже уникальному в Table1, а в методе lookup() на поле добавить только колонку с Guid. Будет полноценный выбор Guid'а:
X++:
public void lookup()
{
    Query                   query = new Query();
    QueryBuildDataSource    qbds;
    SysTableLookup          sysTableLookup = SysTableLookup::newParameters(tablenum(Table1), this);
    ;

    sysTableLookup.addLookupfield(fieldnum(Table1, testGuid));
    qbds = query.addDataSource(tablenum(Table1));
    sysTableLookup.parmQuery(query);
    sysTableLookup.performFormLookup();

}
Другого решения не нашел. Если придумаете - напишите, пожалуйста
За это сообщение автора поблагодарили: Poleax (2).
Старый 28.09.2010, 16:35   #6  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Проблема в том, что MS SQL хранит и сортирует GUID (или UNIQUEIDENTIFIER) не в виде текста, а в виде 16-байтного числа. Причем, порядок следования экстентов не соответствует текстовому виду (последние экстент идет впереди).

По-этому, сортировка по GUID будет отличиться от текстового представления.
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: kornix (1).
Старый 28.09.2010, 16:52   #7  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Цитата:
Сообщение от AndyD Посмотреть сообщение
Проблема в том, что MS SQL хранит и сортирует GUID (или UNIQUEIDENTIFIER) не в виде текста, а в виде 16-байтного числа. Причем, порядок следования экстентов не соответствует текстовому виду (последние экстент идет впереди).

По-этому, сортировка по GUID будет отличиться от текстового представления.


Цитата:
Сообщение от kornix Посмотреть сообщение
Судя по всему лукап по полю с типом Guid работает без позиционирования на текущем выбранном элементе. Можно выбрать другое решение, чтобы не дописывать стандартные классы - перекрыть лукап по какому-нибудь другому полю, тоже уникальному в Table1, а в методе lookup() на поле добавить только колонку с Guid. Будет полноценный выбор Guid'а:
X++:
public void lookup()
{
    Query                   query = new Query();
    QueryBuildDataSource    qbds;
    SysTableLookup          sysTableLookup = SysTableLookup::newParameters(tablenum(Table1), this);
    ;

    sysTableLookup.addLookupfield(fieldnum(Table1, testGuid));
    qbds = query.addDataSource(tablenum(Table1));
    sysTableLookup.parmQuery(query);
    sysTableLookup.performFormLookup();

}
Другого решения не нашел. Если придумаете - напишите, пожалуйста
С переходом к основной таблице тоже типа такой баг? Как нибудь решается, без насильственного программирования?
__________________

This posting is provided "AS IS" with no warranties, and confers no rights.
Старый 28.09.2010, 16:53   #8  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Цитата:
Сообщение от AndyD Посмотреть сообщение
Проблема в том, что MS SQL хранит и сортирует GUID (или UNIQUEIDENTIFIER) не в виде текста, а в виде 16-байтного числа. Причем, порядок следования экстентов не соответствует текстовому виду (последние экстент идет впереди).

По-этому, сортировка по GUID будет отличиться от текстового представления.
Действительно, причем в аксапте даже селект написать для выборки guid'а нельзя. Вот оно, объяснение
За это сообщение автора поблагодарили: plumbum (1).
Старый 28.09.2010, 16:55   #9  
tricky is offline
tricky
Участник
 
140 / 64 (3) ++++
Регистрация: 03.05.2005
Адрес: Гуково
Цитата:
Сообщение от Poleax Посмотреть сообщение




С переходом к основной таблице тоже типа такой баг? Как нибудь решается, без насильственного программирования?
Думаю лучше вообще отказаться от ключевого поля типа Guid, а использовать String с заполнением его типа
X++:
guid2str(newGuid())
.
Старый 28.09.2010, 16:56   #10  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Цитата:
Сообщение от Poleax Посмотреть сообщение




С переходом к основной таблице тоже типа такой баг? Как нибудь решается, без насильственного программирования?
Да, при переходе к основной таблице та же проблема - нет фильтрации по Guid. Единственное решение на мой взгляд - лукап по другому уникальному полю, и отображение в лукапе вашего столбца с guid'ом.
Старый 28.09.2010, 17:15   #11  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Кстати, Аксапта сама при открытии лукапа или переходе к основной таблице передает идентификатор "00000000-0000-0000-0000-000000000000", так что в любом случае не будет работать нормально.
__________________
Axapta v.3.0 sp5 kr2
Старый 28.09.2010, 17:21   #12  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Цитата:
Сообщение от tricky Посмотреть сообщение
Думаю лучше вообще отказаться от ключевого поля типа Guid, а использовать String с заполнением его типа
X++:
guid2str(newGuid())
.
Этого бы как раз не хотелось.
__________________

This posting is provided "AS IS" with no warranties, and confers no rights.
Старый 28.09.2010, 17:27   #13  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Еще один момент.

По-моему, не самый лучший подход использовать GUID (и вообще любое случайно генерируемое значение) в качестве кластерного ключа.
В случае интенсивного добавления записей будет происходить перестройка страниц с уже существующими данными, что приведет к существенно большим блокировкам, чем при использовании простого возрастающего идентификатора
__________________
Axapta v.3.0 sp5 kr2
Старый 30.09.2010, 11:22   #14  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Post
Цитата:
Сообщение от Poleax Посмотреть сообщение
Переход к основной таблице тоже автоматически не ставить курсор в гриде. (На форме1 в DataSource индекс проставлен по таблице1)
Дописываем. Вызываем метод возвращающий guid на "родительской" форме, далей просто курсор в запросе ставим на нужную запись.:
В \Forms\Form1
X++:
//\Forms\Form1\Methods\classDeclaration
public class FormRun extends ObjectRun
{
    guid    _guid;
}

//\Forms\Form1\Methods\init
public void init()
{
    Object callerFromRun = element.args().caller();
    ;

    if (callerFromRun && formhasMethod(callerFromRun, identifierstr(getTestGUID)))
    {
        _guid  = callerFromRun.getTestGUID();
    }

    super();
}

//\Forms\Form1\Data Sources\Table1\Methods\executeQuery
public void executeQuery()
{
    Table1   _table1;
    ;

    super();

    if(_guid)
    {
        _table1 = Table1::find(_guid);
        Table1_ds.findRecord(_table1);
    }

}
\Forms\Form2
X++:
//\Forms\Form2\Methods\getTestGUID
guid getTestGUID()
{
    return Table2.testGUID;
}
Вложение 6213
__________________

This posting is provided "AS IS" with no warranties, and confers no rights.

Последний раз редактировалось Poleax; 06.12.2010 в 13:39.
Старый 30.09.2010, 12:31   #15  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
У вас таблица большая?

В общем, не надо так делать - иначе получите большие тормоза в неожиданном месте
__________________
Axapta v.3.0 sp5 kr2
Старый 30.09.2010, 13:03   #16  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Цитата:
Сообщение от AndyD Посмотреть сообщение
У вас таблица большая?

В общем, не надо так делать - иначе получите большие тормоза в неожиданном месте
Что не надо? Какие тормоза?
Таблица не большая < 5 тысч записей
__________________

This posting is provided "AS IS" with no warranties, and confers no rights.
Старый 30.09.2010, 13:32   #17  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
тормоза при переходе к вашей форме.
__________________
Axapta v.3.0 sp5 kr2
Старый 30.09.2010, 13:34   #18  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Цитата:
Сообщение от AndyD Посмотреть сообщение
тормоза при переходе к вашей форме.
Тормозов нет и не будет. По guid есть индекс. Все нормально работает, вопрос с переходом решен, так как стандартного нет.
__________________

This posting is provided "AS IS" with no warranties, and confers no rights.
Старый 30.09.2010, 13:42   #19  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Poleax Посмотреть сообщение
Что не надо? Какие тормоза?
Не надо findRecord() использовать, если нет уверенности, что таблица будет реально маленькой При неудачном стечении обстоятельств для выполнения findRecord() клиент может засосать всю таблицу к себе в оперативку (были прецеденты).
Старый 30.09.2010, 13:44   #20  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Не надо findRecord() использовать, если нет уверенности, что таблица будет реально маленькой При неудачном стечении обстоятельств для выполнения findRecord() клиент может засосать всю таблицу к себе в оперативку (были прецеденты).
Что рекомендуешь вместо findRecord?
__________________

This posting is provided "AS IS" with no warranties, and confers no rights.
Теги
ax2009, guid, lookup, relation

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Можно сделать lookup по полю типа Base Enum? Hidden DAX: Программирование 25 04.10.2017 13:06
Фильтр по полю и lookup kalex_a DAX: Программирование 11 17.09.2009 13:16
Фильтр в Lookup по полю другой таблицы gefr DAX: Программирование 6 12.03.2007 13:06
multiselect при lookup-е значения типа enum nebula DAX: Программирование 4 14.12.2006 18:56
Фильтр по полю типа Enum, в котором чиловое значение? slava DAX: Программирование 1 08.05.2002 10:26

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

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

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