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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.09.2010, 16:12   #1  
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   #2  
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:52   #3  
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:55   #4  
tricky is offline
tricky
Участник
 
140 / 64 (3) ++++
Регистрация: 03.05.2005
Адрес: Гуково
Цитата:
Сообщение от Poleax Посмотреть сообщение




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




С переходом к основной таблице тоже типа такой баг? Как нибудь решается, без насильственного программирования?
Да, при переходе к основной таблице та же проблема - нет фильтрации по Guid. Единственное решение на мой взгляд - лукап по другому уникальному полю, и отображение в лукапе вашего столбца с guid'ом.
Старый 01.10.2010, 13:06   #7  
titov is offline
titov
Участник
 
73 / 87 (3) ++++
Регистрация: 23.12.2005
Адрес: Казань
Цитата:
Сообщение от Poleax Посмотреть сообщение
С переходом к основной таблице тоже типа такой баг? Как нибудь решается, без насильственного программирования?
что подразумевается под "насильственного программирования"?

есть такой вариант - немного подправить класс SysSetupFormRun
X++:
void initGuidLookupFieldValue()
{
    Common                  record;
    SysDictTable            dt;
    guid                    guidLookupValue;
    ;
    if( !this.args()
    ||  !this.args().lookupField()
    ||  !this.args().lookupValue()
    ||  !this.dataSourceCount()
    )
        return;
    dt      = new SysDictTable(this.dataSource(1).cursor().TableId);
    if(dt.fieldObject(this.args().lookupField()).baseType() != types::Guid)
        return;
    if(!dt.hasRecidIdx()) //?!
        return;
    guidLookupValue     = str2guid(this.args().lookupValue());
    record              = dt.makeRecord();
    select firstonly recid from record
        where   record.(this.args().lookupField())  == guidLookupValue;
    if(!record.RecId)
        return;
    this.args().lookupField(dt.fieldName2Id(identifierStr(recid)) );
    this.args().lookupValue(int642str(record.RecId));
}
PHP код:
public void init()
{
    
// <GEEU>
    
this.raiseEvent_W(methodstr(FormRunListener_WbeforeInit));
    
// </GEEU>
    
super();
    
SysSecurityFormSetup::loadSecurity(this);
    
this.dimensionFieldCtrls();
    
this.inventStorageDimFieldCtrls();
    if (
this.isWorkflowEnabled())
    {
        
workflowControls SysWorkflowFormControls::construct(this);
        
workflowControls.initControls();
    }
    
// <GEEU>
    
this.raiseEvent_W(methodstr(FormRunListener_WafterInit));
    
// </GEEU>
    
this.initGuidLookupFieldValue();// <==

позиционирование работает и при лукапе и при переходе
минусы
1. сортировка по recid - но не вижу разницы между guid или recid сортировкой.
2. да, затронут стандартный класс.
За это сообщение автора поблагодарили: gl00mie (3), player (1).
Теги
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, время: 10:16.