|
![]() |
#1 |
MCP
|
Стал перекрывать лукап программно, либо я что-то не так делаю, либо в аксапте не предусмотрено перекрытие лукапа для контролов типа 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; // без этого изменения лукап не работает (перекрытый) <-- } } ![]() |
|
![]() |
#2 |
MCP
|
![]()
Судя по всему лукап по полю с типом 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). |
![]() |
#3 |
Модератор
|
Цитата:
Сообщение от 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. |
|
![]() |
#4 |
Участник
|
|
|
![]() |
#5 |
Модератор
|
Этого бы как раз не хотелось.
__________________
This posting is provided "AS IS" with no warranties, and confers no rights. |
|
![]() |
#6 |
MCP
|
Да, при переходе к основной таблице та же проблема - нет фильтрации по Guid. Единственное решение на мой взгляд - лукап по другому уникальному полю, и отображение в лукапе вашего столбца с guid'ом.
|
|
![]() |
#7 |
Участник
|
Цитата:
есть такой вариант - немного подправить класс 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 код:
минусы 1. сортировка по recid - но не вижу разницы между guid или recid сортировкой. 2. да, затронут стандартный класс. |
|
|
За это сообщение автора поблагодарили: gl00mie (3), player (1). |