25.09.2008, 07:25 | #1 |
Участник
|
сортировка сотрудников (Axapta 3.0 EE SP 4 FP1 )
необходимо отсортировать сотрудников заданного подразделения на заданное число по должности, разряду и окладу.
пытаюсь реализовать подобным образом X++: RPayHrmOrganization = queryRun.get(tableNum(RPayHrmOrganization));//подраздел while select EmplId from Empl//выбираем сотрудника { //находим последнюю запись по сотр на заданное число заданного подразделения (записей по сотруднику может быть несколько) select firstonly rPayHistoryGeneral order by startDate desc, TransTime desc, hrmPositionId asc, tradeCategory asc where rPayHistoryGeneral.StartDate <= toDate && rPayHistoryGeneral.hrmOrganizationId == RPayHrmOrganization.hrmOrganizationId && empl.EmplId == rPayHistoryGeneral.number; ... to tempTable //загружаем данные по сотрудникам во временную таблицу и уже от туда выбираем отсортированные данные } заранее благодарен за конструктивные предложения ... |
|
25.09.2008, 09:02 | #2 |
Moderator
|
Учитывая способность Set к автоматической сортировке своих элементов, можно как-то так попробовать:
X++: Set sortedEmpl = new Set(Types::Container); sortedEmpl.add([, , , RecId , ]); |
|
25.09.2008, 12:14 | #3 |
Участник
|
Цитата:
Не, не пойдет. |
|
25.09.2008, 13:09 | #4 |
Участник
|
RecordSortedList?
В нем порядок сортировки можно указать при инициализации |
|
25.09.2008, 14:03 | #5 |
Moderator
|
mazzy, что за приговор?
И что, вообще не пользоваться Set'ами теперь? Тоже пойдёт. Надо только иметь в виду, что таблицу можно указать только одну. Если поля выборки ограничены одной таблицей, то нормально. Впрочем, если некоторые поля не будут задействованы, а требуется запомнить данные из других таблиц, то можно подобрать для хранения подходящие из незадействованных (ну и что, что в RecId, например, вес человека похраним? это ж временно ) |
|
25.09.2008, 14:21 | #6 |
Administrator
|
Если я правильно понял mazzy - то он имел в виду - что Set - это конструкция, которая хранится в памяти (клиента или сервера - это как создашь). Сливать в Set табличку из БД, особенно - если табличка содержит в себе много записей - не есть хорошо, ибо оперативная память гораздо меньше по объему - нежели память на жестком диске - т.е. в этом случае временная табличка предпочтительнее Set-а, т.к. она хранится на диске.
Set-ами пользоваться можно... но не для хранения целых таблиц же... Иначе будет как в том анекдоте - про японскую пилу и суровых сибирских мужиков...
__________________
Возможно сделать все. Вопрос времени |
|
25.09.2008, 14:26 | #7 |
Участник
|
Точно, спасибо.
|
|
25.09.2008, 14:42 | #8 |
Moderator
|
Таблица таблице - рознь Судя по постановке, речь идёт в худшем случае об EmplTable, а в "менее худшем" - о подразделении, т.е. о подмножестве этой таблицы. Ну сколько записей попадает в фокус проблемы? Думаю, счёт вряд ли более, чем на сотни. Да даже пара-тройка тысяч - думаю, не вопрос для Set из контейнеров на 5-10 полей.
|
|
25.09.2008, 14:44 | #9 |
Участник
|
то что Vldmr с помощью RecordSortedList так просто не сделать, потому как там у него сортировка вроде по полям разных таблиц. Но, с другой стороны, кто мешает набить RecordSortedList любыми нужными нам значениями? Например сделать RecordSortedList на основании таблицы EmplTable, а под те поля, которых нет в ней не было, использовать любые другие подходящие.
|
|
25.09.2008, 14:45 | #10 |
Участник
|
С чего это вы взяли? См. первое сообщение.
В нем участвует по крайней мере ТРИ таблицы. Среди них rPayHistoryGeneral |
|
25.09.2008, 14:56 | #11 |
Moderator
|
Цитата:
Сообщение от coolibin
то что Vldmr с помощью RecordSortedList так просто не сделать, потому как там у него сортировка вроде по полям разных таблиц. Но, с другой стороны, кто мешает набить RecordSortedList любыми нужными нам значениями? Например сделать RecordSortedList на основании таблицы EmplTable, а под те поля, которых нет в ней не было, использовать любые другие подходящие.
Цитата:
Сообщение от Gustav
Надо только иметь в виду, что таблицу можно указать только одну. Если поля выборки ограничены одной таблицей, то нормально.
Впрочем, если некоторые поля не будут задействованы, а требуется запомнить данные из других таблиц, то можно подобрать для хранения подходящие из незадействованных (ну и что, что в RecId, например, вес человека похраним? это ж временно ) Цитата:
|
|
25.09.2008, 15:11 | #12 |
Участник
|
Цитата:
Но все равно использование структур, которые работают на клиенте/АОСе, трансфер данных с сервера на клиента/АОС мне не кажется правильным. Однако, предложений у меня нет, поэтому считаем мою критику неконструктивной и не рассматриваем |
|
25.09.2008, 15:27 | #13 |
Участник
|
Тащить можно не все данные, а только те, которые нужны для выполнения задачи, в данном случае, по которым нужна сортировка. Это не так и много.
|
|
26.09.2008, 05:31 | #14 |
Участник
|
Всем спасибо, воспользовался советом "Gustav", через Set, все прекрасно получилось. Уяснил для себя, что контейнер в Set сортируется последовательно, по всем полям.
P.S. Две таблици, сортировка по 2м полям. Кол-во записей 5, строк не более 4000 ... Кто-нибудь может подсказать по вложенным запросам? Пытался реализовать эту конструкцию через вложенный запрос, что то вида: X++: while select EmplId from empl where RPayHrmOrganization.hrmOrganizationId == (select firstonly rPayHistory order by startDate desc,TransTime desc where Empl.EmplId == rPayHistoryLocal.Number && rPayHistoryLocal.StartDate <= toDate).hrmOrganizationId Последний раз редактировалось Vldmr; 26.09.2008 в 05:42. |
|
26.09.2008, 09:38 | #15 |
Участник
|
Что-то у вас каша в запросе получилась.
Во-первых, Аксапта не делает вложенные запросы. Во-вторых, не помню точно, как называется запрос такого вида, как вы сделали по rPayHistory, по-моему запрос по полю, но у него есть некоторые правила. Для его выполнения необходимо указать имя таблицы, по которой выполняется запрос, в точно так же, как и в AOT. Определять табличную переменную для этого запроса не требуется. В предложении Where в условиях для полей таблицы необходимо так же указывать не имя табличной переменной, а имя таблицы (в данном случае заменить rPayHistoryLocal на rPayHistory). В запросе в том виде, как приведено у вас, вообще может не уйти на сервер, если набранное в where вернет false (а оно будет расчитано по значениям табличных переменных еще до его отправки) или уйдет без where В-третьих, даже если исправить, вы не получите то, что хотите На сервер уйдет один запрос по rPayHistory, где rPayHistory.Number == "" (так как Empl обнулится перед выполнением). А дальше идет запрос по Empl без Where, если значение в RPayHrmOrganization.hrmOrganizationId совпало с тем, что вернул предыдущий запрос. Или вооще ничего не уходит на сервер, если значения не совпали.
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 26.09.2008 в 09:46. |
|