28.09.2010, 14:46 | #1 |
Модератор
|
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 |
MCP
|
Poleax, а что значит курсор не перемещается по GUID? Можешь скрин выложить?
|
|
28.09.2010, 15:27 | #3 |
Модератор
|
Маленький проект для примера Вложение 6194
Имеем Form1. Строки создаются просто Ctrl+N Guid автоматом генерится. Получаем странный lookup. Курсор в гриде лукапа не на месте. Form2 Проект \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 |
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; // без этого изменения лукап не работает (перекрытый) <-- } } |
|
28.09.2010, 16:32 | #5 |
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). |
28.09.2010, 16:35 | #6 |
Участник
|
Проблема в том, что MS SQL хранит и сортирует GUID (или UNIQUEIDENTIFIER) не в виде текста, а в виде 16-байтного числа. Причем, порядок следования экстентов не соответствует текстовому виду (последние экстент идет впереди).
По-этому, сортировка по GUID будет отличиться от текстового представления.
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: kornix (1). |
28.09.2010, 16:52 | #7 |
Модератор
|
Цитата:
Сообщение от 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 |
MCP
|
Цитата:
Сообщение от AndyD
Проблема в том, что MS SQL хранит и сортирует GUID (или UNIQUEIDENTIFIER) не в виде текста, а в виде 16-байтного числа. Причем, порядок следования экстентов не соответствует текстовому виду (последние экстент идет впереди).
По-этому, сортировка по GUID будет отличиться от текстового представления. |
|
|
За это сообщение автора поблагодарили: plumbum (1). |
28.09.2010, 16:55 | #9 |
Участник
|
|
|
28.09.2010, 16:56 | #10 |
MCP
|
Да, при переходе к основной таблице та же проблема - нет фильтрации по Guid. Единственное решение на мой взгляд - лукап по другому уникальному полю, и отображение в лукапе вашего столбца с guid'ом.
|
|
28.09.2010, 17:15 | #11 |
Участник
|
Кстати, Аксапта сама при открытии лукапа или переходе к основной таблице передает идентификатор "00000000-0000-0000-0000-000000000000", так что в любом случае не будет работать нормально.
__________________
Axapta v.3.0 sp5 kr2 |
|
28.09.2010, 17:21 | #12 |
Модератор
|
Этого бы как раз не хотелось.
__________________
This posting is provided "AS IS" with no warranties, and confers no rights. |
|
28.09.2010, 17:27 | #13 |
Участник
|
Еще один момент.
По-моему, не самый лучший подход использовать GUID (и вообще любое случайно генерируемое значение) в качестве кластерного ключа. В случае интенсивного добавления записей будет происходить перестройка страниц с уже существующими данными, что приведет к существенно большим блокировкам, чем при использовании простого возрастающего идентификатора
__________________
Axapta v.3.0 sp5 kr2 |
|
30.09.2010, 11:22 | #14 |
Модератор
|
Цитата:
В \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); } } X++: //\Forms\Form2\Methods\getTestGUID guid getTestGUID() { return Table2.testGUID; }
__________________
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 |
Участник
|
У вас таблица большая?
В общем, не надо так делать - иначе получите большие тормоза в неожиданном месте
__________________
Axapta v.3.0 sp5 kr2 |
|
30.09.2010, 13:03 | #16 |
Модератор
|
Цитата:
Таблица не большая < 5 тысч записей
__________________
This posting is provided "AS IS" with no warranties, and confers no rights. |
|
30.09.2010, 13:32 | #17 |
Участник
|
тормоза при переходе к вашей форме.
__________________
Axapta v.3.0 sp5 kr2 |
|
30.09.2010, 13:34 | #18 |
Модератор
|
Тормозов нет и не будет. По guid есть индекс. Все нормально работает, вопрос с переходом решен, так как стандартного нет.
__________________
This posting is provided "AS IS" with no warranties, and confers no rights. |
|
30.09.2010, 13:42 | #19 |
Участник
|
|
|
30.09.2010, 13:44 | #20 |
Модератор
|
Что рекомендуешь вместо findRecord?
__________________
This posting is provided "AS IS" with no warranties, and confers no rights. |
|