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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.02.2014, 07:01   #1  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Lookup с сотрудниками конкретного подразделения
Добрый день! Задача такая: нужно в лукапе вывести только тех сотрудников, которые работают в определенном подразделении. Написан такой код

X++:
    EmplTable                   tempEmplTableLookup, employees;
    DirPartyTable               emplNames;
    RpayHrmOrganization         HrmOrganization;

    SysTableLookup              sysTableLookup;

    Query                       query = new Query();
    QueryBuildDataSource        queryBDS;
    ;


    //Делаем таблицу временной
    tempEmplTableLookup.setTmp();

    //Выбираем из таблицы рейсов
    sysTableLookup = SysTableLookup::newParameters(tablenum(EmplTable), this);

    //Добавляем столбцы
    sysTableLookup.addLookupfield(fieldnum(EmplTable, EmplId));
    sysTableLookup.addLookupfield(fieldnum(EmplTable, Del_Name));
    sysTableLookup.addLookupfield(fieldnum(EmplTable, Title));


    //Перебираем сотрудников и ищем там тех, кто в ЛО. При этом, они должны быть не уволенными
    ttsbegin;
    while select * from employees join emplNames join HrmOrganization
        where employees.PartyId == emplNames.PartyId
        && HrmOrganization.hrmOrganizationId == employees.PayHRMOrganizationId_RU
        && !employees.PayResignedDate_RU
        {
            if (HrmOrganization.parentOrganizationId like 'ЛО*')
            {
                tempEmplTableLookup.clear();
                tempEmplTableLookup.data(employees);
                tempEmplTableLookup.DEL_Name = employees.name();
                tempEmplTableLookup.insert();
            }
            
        }
    ttscommit;

    //Добавляем сотрировку
    queryBDS = query.addDataSource(tablenum(EmplTable));
    queryBDS.addSortField(fieldnum(EmplTable, DEL_Name), SortOrder::Ascending);
    sysTableLookup.parmQuery(query);


    //BP Deviation Documented
    sysTableLookup.parmTmpBuffer(tempEmplTableLookup);
    sysTableLookup.performFormLookup();
При выполнении дает ошибку: Невозможно создать запись в Окружение (RHRMVirtualNetworkTable). Респондент: 6666, 6666.
Запись уже существует.


Что это значит? Может как-то по-другому можно реализовать данную операцию

MS DAX 2009
Старый 18.02.2014, 08:01   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,430 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Попробуйте не insert(), а doInsert(). Возможно метод insert перекрыт на таблице и несмотря на то что таблица временная все равно что-то делает.
За это сообщение автора поблагодарили: Vasiliusis (1).
Старый 18.02.2014, 08:20   #3  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
365 / 543 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Не понимаю почему нельзя использовать стандартную lookup форму? Добавьте DS по DirPartyTable и возьмите от туда наименование, ну и свои условия дополнительные какие необходимы, и не нужно никаких временных таблиц и транзакций и работать будет быстрее.
__________________
Sergey Nefedov
Старый 18.02.2014, 08:51   #4  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от SRF Посмотреть сообщение
Не понимаю почему нельзя использовать стандартную lookup форму? Добавьте DS по DirPartyTable и возьмите от туда наименование, ну и свои условия дополнительные какие необходимы, и не нужно никаких временных таблиц и транзакций и работать будет быстрее.
вы имеете ввиду Query? А как мне вытащить должность человека? и подразделение? они то идут из EmplTable... если бы в DirPartyTable наподобие метода name были бы методы для извлечения подразделения и должности... тогда да возможно, можно было бы и через фильтр сделать
Старый 18.02.2014, 08:51   #5  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Попробуйте не insert(), а doInsert(). Возможно метод insert перекрыт на таблице и несмотря на то что таблица временная все равно что-то делает.
Сработало. Вы как всегда на высоте!
Старый 18.02.2014, 09:01   #6  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
365 / 543 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от Vasiliusis Посмотреть сообщение
вы имеете ввиду Query? А как мне вытащить должность человека? и подразделение? они то идут из EmplTable... если бы в DirPartyTable наподобие метода name были бы методы для извлечения подразделения и должности... тогда да возможно, можно было бы и через фильтр сделать
Я имею ввиду lookup форму EmplTableLookup, которая привязана к EDT EmplId, там в стандарте один DS подвешан EmplTable, добавьте к нему DirPartyTable ну и свои DS если нужны еще какие то данные из других таблиц(хотя из вопроса достаточно будет и exists join), ваш запрос рисуется минут за тридцать.

В крайнем случае можете сделать свою лукап форму.
__________________
Sergey Nefedov
Старый 18.02.2014, 09:44   #7  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,129 / 917 (35) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от Vasiliusis Посмотреть сообщение
Сработало.
Ну хотя бы like в запрос запихайте. И код отформатируйте по человечески. Глаза режет.
__________________
Isn't it nice when things just work?

Последний раз редактировалось macklakov; 18.02.2014 в 09:46.
Старый 18.02.2014, 10:16   #8  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от macklakov Посмотреть сообщение
Ну хотя бы like в запрос запихайте. И код отформатируйте по человечески. Глаза режет.
спасибо за советы...
Старый 18.02.2014, 10:18   #9  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от SRF Посмотреть сообщение
Я имею ввиду lookup форму EmplTableLookup, которая привязана к EDT EmplId, там в стандарте один DS подвешан EmplTable, добавьте к нему DirPartyTable ну и свои DS если нужны еще какие то данные из других таблиц(хотя из вопроса достаточно будет и exists join), ваш запрос рисуется минут за тридцать.

В крайнем случае можете сделать свою лукап форму.
спасибо, конечно, но я сделал как сделал (убрал DirPartyTable, она не нужна оказалась) и работает быстро и выводит что нужно. Доп. формы под это писать времени нет. Без формы EmplTableLookup тоже ИМХО я обошелся прекрасно
Старый 18.02.2014, 10:36   #10  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Vasiliusis Посмотреть сообщение
спасибо, конечно, но я сделал как сделал (убрал DirPartyTable, она не нужна оказалась) и работает быстро и выводит что нужно. Доп. формы под это писать времени нет. Без формы EmplTableLookup тоже ИМХО я обошелся прекрасно
При программировании чего либо нужно помнить о масштабируемости написанного Вами кода.
Вот вы сделали что то свое, локальное. Которое будет работать в определенных случаях, отвечающих Вашим условиям, а стандарт уже нормально работать не будет.
И если вдруг в будущем потребуется использование стандарта, Вам придется либо переделывать то что сделали раньше, либо "уходить дальше в лес" и городить ещё что нибудь свое.

Иногда, лишние 20 минут, потраченные сейчас, экономят гораздо больше времени в будущем.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 18.02.2014, 11:34   #11  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
365 / 543 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от Vasiliusis Посмотреть сообщение
спасибо, конечно, но я сделал как сделал (убрал DirPartyTable, она не нужна оказалась)
Когда я говорил подвесить ds по DirPartyTable, то имел ввиду использовать его вместо employees.name(), а не вместо курсора emplNames, который избыточен.

Из кода вашего метода было понятно что вам нужны данные из 2 разных таблиц в одной лукап форме с возможностью сортировки и фильтрации, а этого можно добиться при помощи формы (ну и временной таблицы, что не всегда выгодно, при нескольких тысячах записей вы уже будет наблюдать подтормаживание при открытии лукапа, которое через некоторое время начнет раздражать пользователей).

Цитата:
Сообщение от Vasiliusis Посмотреть сообщение
и работает быстро и выводит что нужно.
Прекрасно.

Цитата:
Сообщение от Vasiliusis Посмотреть сообщение
Доп. формы под это писать времени нет.
Оно и заметно, потратить 30 минут на форму действительно много, гораздо лучше использовать DEL_* поля и метод лукап писать непосредственно на контролах, а потом копировать этот метод при необходимости
__________________
Sergey Nefedov
Старый 18.02.2014, 14:13   #12  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от SRF Посмотреть сообщение
Оно и заметно, потратить 30 минут на форму действительно много, гораздо лучше использовать DEL_* поля и метод лукап писать непосредственно на контролах, а потом копировать этот метод при необходимости
Понимаете, у меня нет времени разбираться, и я практически никогда не имел дела с lookup-формами. Я так могу просидеть и 30 минут и час и 5 часов. Вы же код за меня не напишете, поэтому пока я оставлю этот код.
Кроме этого, я знаю что все эти переписи лукап-методов нужно писать на уровне датасорсов (ох уж это академическое аксаптовское образование), но эта операция настолько редко встречается (в количестве одна штука), что ... ну это не первоочередная задача совсем.
Старый 18.02.2014, 14:20   #13  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от SRF Посмотреть сообщение
Оно и заметно, потратить 30 минут на форму действительно много, гораздо лучше использовать DEL_* поля и метод лукап писать непосредственно на контролах, а потом копировать этот метод при необходимости
И ведь, даже туториала нет никакого... подскажите, где инфу взять? гугл обычно в таких вещах бессилен
Старый 18.02.2014, 14:43   #14  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
365 / 543 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от Vasiliusis Посмотреть сообщение
гугл обычно в таких вещах бессилен
Не сильное ли утверждение? ) lookup form in axapta Вторая ссылка идет на данный форум )
__________________
Sergey Nefedov
Старый 19.02.2014, 06:09   #15  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от SRF Посмотреть сообщение
Не сильное ли утверждение? ) lookup form in axapta Вторая ссылка идет на данный форум )
сделал вьюху и через query...
Старый 19.02.2014, 13:17   #16  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от SRF Посмотреть сообщение
Не сильное ли утверждение? ) lookup form in axapta Вторая ссылка идет на данный форум )
о чем я и говорил. Как ее в принципе создавать я могу посмотреть в книге, которая у меня под рукой. А вот почему оная форма не запускается (просит какой-то там параметр) - этого увы гугл не знает. я именно об этом.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Kashperuk Ivan: Lookup form returning more than one value Blog bot DAX Blogs 0 29.01.2010 18:05
palleagermark: Use keyboard lookup in Product Builder enumerated fields Blog bot DAX Blogs 0 18.08.2009 23:06
gatesasbait: How to define a custom lookup form for an extended datatype Blog bot DAX Blogs 0 09.07.2008 22:05
Создание Lookup формы Maxim Gorbunov DAX: База знаний и проекты 9 26.06.2007 16:44
Динамические Lookup формы. Андрей Василюк DAX: База знаний и проекты 0 07.12.2001 07:07

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:10.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.