![]() |
#1 |
Участник
|
![]()
Есть стандартный пример функции enum2str:
PHP код:
PHP код:
PHP код:
![]() |
|
![]() |
#2 |
Участник
|
непонятно. похоже опять что-то с преобразованием типов в AnyType...
я хотел про другое сказать... ваш код чудовищно неоптимален. особенно в 3хуровневной архитектуре. лучше написать что-то в виде PHP код:
Запрос выполняется на сервере, а не на клиенте. Количество записей, которое передается на клиента на несколько порядков меньше. Следовательно меньше трафик. Следовательно меньше требования к клиенту. Следовательно меньше блокировок. Следовательно общая производительность повышается. |
|
![]() |
#3 |
Administrator
|
Как говорится, Сократ мне друг, но истина дороже.
1. Вообще-то, запрос всегда будет выполняться на сервере БД, так как он является запросом к БД ![]() 2. Следовательно траффик не при чем, требования к клиенту вообще не при делах (Сергей, правда, имел ввиду требования к каналу связи ![]() 3. Записей в варианте mazzy будет возвращено больше, хотя бы потому, что его запрос просто подразумевает возвращение большего количества записей (у DeepDreamer их будет всего одна, так как он ввернул firstonly в свой запрос). А по вопросу DeepDreamer могу только сказать, что это очередной заскок компилятора, который, впрочем, связан с очевидным недостатком синтаксиса X++. Дело в том, что функция enum2str() должна догадаться о том, какой тип имеет enum (он не передается как аргумент) исходя из синтаксиса метода. Видимо получение значения enum'а из anytype очень сильно путает компилятор. Сделайте так: PHP код:
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
![]() |
#4 |
Участник
|
Цитата:
Изначально опубликовано Maxim Gorbunov
3. Записей в варианте mazzy будет возвращено больше, хотя бы потому, что его запрос просто подразумевает возвращение большего количества записей (у DeepDreamer их будет всего одна, так как он ввернул firstonly в свой запрос). Смысл с этим модификатором полностью теряется. Задача (насколько я понимаю): получить список типов коррсчетов, которые используются в журналах. Да, запрос будет выполняться на сервере. Но в первом случае, ВСЯ логика обработки выполняется на клиенте. Во втором случае почти вся логика выполняется на сервере. Спасибо за решение. |
|
![]() |
#5 |
Участник
|
Функция вызывается с параметром tmp типа LedgerJournalACType, т.е. enum. Но после присвоения anytype получается, что передаётся туда совсем не enum... Это как?
Re: Цитата:
ваш код чудовищно неоптимален.
![]() |
|
![]() |
#6 |
Administrator
|
Цитата:
Изначально опубликовано Deep Dreamer
Функция вызывается с параметром tmp типа LedgerJournalACType, т.е. enum. 2mazzy: Да, вероятно задача именно так стоит. Из того, что написал вначале DeepDreamer я задачи не понял: рассматривал исключительно как код, не имеющий особого смысла ![]() 2DeepDreamer: В варианте, предложенном mazzy, group by играет ту же роль, что и DISTINCT в TSQL. Используйте такой подход. Во избежание недопонимания замечу еще раз, что нагрузка в этом случае переносится на сервер БД, а не на сервер приложений, что, на самом деле, еще лучше (согласно Best Practice).
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
![]() |
#7 |
Участник
|
Раскопал этот старый тред
![]() В результате разбора полетов выяснил вот что: Собственно, ошибка возникает на tmp = si.value(); Причем, причина не в anytype, а в том, как SetIterator возвращает значение. Любой enum, помимо самого значения, содержит так же тип, к которому он принадлежит. Так вот, SetIterator возвращает значение с типом 65237 (0xFED5). При присвоении енуму с определенным типом (в данном случае LedgerJournalACType) и происходит ошибка конвертации. Вариантов лечения этой проблемы несколько. Первый предложил Maxim Gorbunov - преобразовывать полученное значение в целое, а затем уже его присваивать енуму. Второй - использовать в Set'е целочисленное значение (Types::Integer). В этом случае перед вызовом Add() надо будет преобразовать сохраняемый енум в целое. При считывании преобразований делать не надо - конвертация произойдет автоматически Третий - использовать вместо SetIterator - SetEnumerator. Енумератор возвращает значение как целое и дополнительных преобразований делать не надо. Из всего этого следует вот что: внутри set'а не делается различия между разными типами енумов. Например, если в Set добавить ABC::B и ABCModel::Value (оба имеют одинаковое enumValue=2), то получить из него можно только это самое значение (2) - без привязки к типу. Причем, значение будет единственное Все это также относится и к Map'у. Единственное отличие - MapIterator.key() (а так же MapIterator.value()) возвращает целочисленное значение.
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: KiselevSA (2). |