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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.11.2009, 16:06   #1  
3oppo is offline
3oppo
Участник
Аватар для 3oppo
 
222 / 32 (2) +++
Регистрация: 30.06.2005
Find для Common-а
Задача: Метод принимает тип Common (заполненный), нужно узнать есть ли такая запись в таблице. Проблема в том, что мы не знаем какие поля для таблицы являются ключевыми ...
Самое реальное решение задачи, которое приходит мне на ум, это определить некий аналог метода find на базе common-а, для необходимых таблиц (это около 20 таблиц). Может быть, будут какие ни будь другие идеи? Скорость работы является достаточно критичным параметром.
Старый 11.11.2009, 16:16   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Ну, если есть гарантия, что на таблице есть ключевое поле(я), то можно их найти с помощью DictTable
И построить запрос указывая эти поля.

Но вообще если у вас заполнена вся запись Common на входе, то возможно там заполнен и RecID? Тогда по нему
Старый 11.11.2009, 16:16   #3  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Только по RecID и индексом по нему ...
Common, как и xRecord, для модификации пользователю недоступны
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 11.11.2009, 16:17   #4  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Посмотрите как реализованы методы Global::record2dynaKey и Global::dynaKey2record
__________________
Sergey Nefedov
За это сообщение автора поблагодарили: 3oppo (1).
Старый 11.11.2009, 16:25   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Если будете делать так написали, то обязательно оберните всё это дело в Map.

На ум пришла ещё такая идея. Повесить уникальный индекс на нужные поля и попытаться вставить запись. Если такая уже есть, то вызовется исключение, которое можно перехватить, если нужно. Может ещё кто подскажет, как не вставляя запись вызвать такую проверку на уникальность (не уверен точно, сработает ли validateWrite)
Старый 11.11.2009, 16:28   #6  
3oppo is offline
3oppo
Участник
Аватар для 3oppo
 
222 / 32 (2) +++
Регистрация: 30.06.2005
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Ну, если есть гарантия, что на таблице есть ключевое поле(я), то можно их найти с помощью DictTable
И построить запрос указывая эти поля.

Но вообще если у вас заполнена вся запись Common на входе, то возможно там заполнен и RecID? Тогда по нему

Думал.. Это долго.
Старый 11.11.2009, 16:30   #7  
3oppo is offline
3oppo
Участник
Аватар для 3oppo
 
222 / 32 (2) +++
Регистрация: 30.06.2005
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Если будете делать так написали, то обязательно оберните всё это дело в Map.
Зачем?
Старый 11.11.2009, 16:33   #8  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Хы, интересно.

Мы не знаем, в какой таблице ищем. А что мы ищем - знаем?
Т.е. у нас на входе:
1) Common
2) Некие критерии

Вопрос - что предасталяют собой критерии? Если критерии - это значения каких-то полей, то что даст набор ключевых полей. К примеру,
критерий поиска = ["ItemId1", "ItemName111"] - 2 поля
ключевые поля таблицы = [ItemId] - 1 поле
И что с этим делать? В любом случае искать придется по связке ItemId+ItemNam, и не важно - ключевой это набор или нет.
Старый 11.11.2009, 16:38   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от 3oppo Посмотреть сообщение
Зачем?
Для унифицированно доступа к методам на 20-ти таблицах.
А как вы собирались их вызывать?

И вообще действительно, уточнили бы постановку задачи. Каким образом заполняется Common?
Старый 11.11.2009, 16:44   #10  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
На мой взгляд поиск по RecId (как рекомендовал kashperuk) в Вашем случае, самое нормальное, другое трудно себе представить...

Не понятно как передать параметры (не в каком виде, а в каком порядке)...
Не известно каких типов будут эти ключевые поля (string, date, int и т.п), что бы потом правильно подставить их в запрос...
и ещё много можно придумать неизвестностей.

а если говорить про поиск по RecId, то написали бы в классе SysDictTable статический метод find(TableId _tableId, RefRecId _recId, boolean _forUpdate = false) и думаю должно заработать.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 11.11.2009, 16:51   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Что-то я не пойму.
У нас есть ReсId для поиска (или всё-таки нету?)
Но нет уверенность, что этот RecId в нашу таблицу вставлен?
Старый 11.11.2009, 16:57   #12  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
может кому пригодиться ради спортивного интереса создал у себя следующее:
1. В классе SysDictTable метод find():
X++:
static Common find(TableId  _tableId, RefRecId  _recId, boolean _forUpdate = false)
{
    Common      common;
    DictTable   dictTable;
    ;

    if (_recId != 0)
    {
        dictTable   = new DictTable(_tableId);
        common = dictTable.makeRecord();

        common.selectForUpdate(_forUpdate);

        select firstOnly common
            where common.RecId  == _recId;
    }

    return common;
}
2. Job для теста метода:
X++:
static void testFindCommon(Args _args)
{
    InventTable inventTable;
    Common      common;
    ;

    select firstonly inventTable;
    // без forUpdate -->
    common  = SysDictTable::find(inventTable.TableId, inventTable.RecId);

    info(strFmt('До update - %1', common.(fieldNum(InventTable, ItemId))));
    // без forUpdate <--

    // с forUpdate -->
    ttsbegin;

    common  = SysDictTable::find(inventTable.TableId, inventTable.RecId, true);
    common.(fieldNum(InventTable, ItemId)) = common.(fieldNum(InventTable, ItemId)) + 'Тест';
    common.doUpdate();

    ttscommit;

    info(strFmt('После update - %1', common.(fieldNum(InventTable, ItemId))));
    // с forUpdate <--
}
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: 3oppo (1), propeller (1).
Старый 11.11.2009, 17:02   #13  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Жалко, что нет возможность расширять класс Common, а то c кучи таблиц можно было бы снести метод findRecId
За это сообщение автора поблагодарили: 3oppo (1).
Старый 11.11.2009, 17:08   #14  
3oppo is offline
3oppo
Участник
Аватар для 3oppo
 
222 / 32 (2) +++
Регистрация: 30.06.2005
Задача вроде ясно описана.
Поиск по RecID не интересует, так как его нет.
Старый 11.11.2009, 17:10   #15  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Жалко, что нет возможность расширять класс Common, а то c кучи таблиц можно было бы снести метод findRecId
а можно и не расширять, а если понадобиться воспользоваться способом, который я описал выше и в преть не писать на всех таблицах метод findRecId
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 11.11.2009, 17:15   #16  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от 3oppo Посмотреть сообщение
Поиск по RecID не интересует, так как его нет.
А какие поля есть? все остальные? или не все? или только те которые входят в PrimaryKey? или в любой уникальный индекс(ы)?
Старый 11.11.2009, 17:21   #17  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от 3oppo Посмотреть сообщение
Задача вроде ясно описана.
Поиск по RecID не интересует, так как его нет.
приношу свои извинения за оффтоп
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 11.11.2009, 17:27   #18  
3oppo is offline
3oppo
Участник
Аватар для 3oppo
 
222 / 32 (2) +++
Регистрация: 30.06.2005
Есть все поля которые нужны для поиска нужной записи.. (можно сказать, что все из прайм индекса)
Старый 11.11.2009, 17:31   #19  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Если вы будете пользоваться таким методом, вы потеряете статическуй типизацию метода find со всеми последствиями:
  • компилятор вас не предупредит, если состав индекса или тип полей изменится
  • редактор не будет подсказывать, какие параметры надо использовать

Не надо использовать такиме общие методы в конкретном коде.
За это сообщение автора поблагодарили: 3oppo (1).
Старый 11.11.2009, 17:35   #20  
3oppo is offline
3oppo
Участник
Аватар для 3oppo
 
222 / 32 (2) +++
Регистрация: 30.06.2005
Знаю что не очень хорошо.. Поэтому и ищу альтернативу. Но похоже что её нет..
Теги
common, find, exists

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
To find objects in AOT with particular properties Blog bot DAX Blogs 1 26.04.2008 07:33
Kashperuk Ivan: Hotkeys and Find vs Filter in Dynamics AX 2009 Blog bot DAX Blogs 2 11.03.2008 12:06
Inside Dynamics AX 4.0: Common Search Blog bot DAX Blogs 0 29.10.2007 10:50
daxmy: AOT Find function Blog bot DAX Blogs 0 17.08.2007 01:23
Dynamics AX Geek: cross-references & find Blog bot DAX Blogs 0 28.10.2006 16:40
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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