13.09.2010, 12:38 | #1 |
----------------
|
Вопросы про RunBase
1. Есть некий серверный обработчик, который вызывается из основного меню и из формы. Один из параметров - код документа, при вызове из формы должен заполниться автоматически.
Как правильно реализовать? 2. В Tutorial_RunbaseBatch метод construct серверный. Таким образом, настройка RunOn в менюитем не играет никакой роли. Это так было задумано и считается правильным или просто так получилось в данном случаи? |
|
13.09.2010, 12:59 | #2 |
Участник
|
Цитата:
при вызове из меню DataSource - не заполнен. при вызове из формы DataSource - должен быть заполнен. чтобы юзать диналинк ничего программировать не нужно, нужно в menuitem формы указать свойство Source. Дальше Аксапта сама свяжет. Цитата:
Идеологически правильно, если вся обработка любым пакетным заданием идет на сервере. Но технически можно и так, и сяк. Поэтому, я воспринимаю слово server в методе, как настоятельный совет следовать идеологии. Но не догму |
|
|
За это сообщение автора поблагодарили: Wamr (1). |
13.09.2010, 13:24 | #3 |
Участник
|
Цитата:
Цитата:
Дело в том, что если для класса указать RunOn=Called from и создавать экземпляр на сервере, то при вызове Prompt() будет создаваться клиентская копия класса.
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Wamr (1). |
13.09.2010, 13:39 | #4 |
Участник
|
только стоит не программировать, а просто поставить свойство
|
|
13.09.2010, 13:45 | #5 |
Участник
|
Это зависит от задачи.
В общем случае может не быть датасорса
__________________
Axapta v.3.0 sp5 kr2 |
|
13.09.2010, 13:53 | #6 |
----------------
|
Прошу прощения за формулировки вопросов.
1. имелся в виду "один из параметров, который выводится в диалог и пользователь может его сменить". Я сомневаюсь, что dynalink в классах работает без программирования, а добавлять в диалог DS, чтобы с ним подвязался исходный курсор, как-то тоже "нелегкое" решение. То что args в main принесет мне данные, я понимаю. Что дальше с ними делать? Пихать в объект через parm метод? А как к этому отнесется getLast при вызове диалога (известно как потрет нафиг)? 2. У меня было мнение, что при установке свойства класса CalledFrom и RunOn=Server на менюитем, получается диалог с пользователем на клиенте без лишнего общения с АОСом и исполнения функционала на сервере. Таким образом, мы можем управлять местом исполнения настройками менюитема. А сделав construct серверным, мы лишаемся такой возможности, не понятно что получив взамен. |
|
13.09.2010, 13:58 | #7 |
Роман Долгополов (RDOL)
|
Цитата:
Сообщение от Wamr
Прошу прощения за формулировки вопросов.
1. имелся в виду "один из параметров, который выводится в диалог и пользователь может его сменить". Я сомневаюсь, что dynalink в классах работает без программирования, а добавлять в диалог DS, чтобы с ним подвязался исходный курсор, как-то тоже "нелегкое" решение. То что args в main принесет мне данные, я понимаю. Что дальше с ними делать? Пихать в объект через parm метод? А как к этому отнесется getLast при вызове диалога (известно как потрет нафиг)? .getLast() .parmXXX(...) .saveLast() |
|
|
За это сообщение автора поблагодарили: Wamr (3). |
13.09.2010, 14:13 | #8 |
Administrator
|
Цитата:
Сообщение от Wamr
2. У меня было мнение, что при установке свойства класса CalledFrom и RunOn=Server на менюитем, получается диалог с пользователем на клиенте без лишнего общения с АОСом и исполнения функционала на сервере. Таким образом, мы можем управлять местом исполнения настройками менюитема. А сделав construct серверным, мы лишаемся такой возможности, не понятно что получив взамен.
С т.з. разработки - в целом тоже не сильно разнится - изменение свойства менюитема также относится к программированию, как и редактирование текста кода класса. Разница лишь в том, что выставляя свойство RunOn=Server у менюитема - мы можем создать второй менюитем, не трогая класс, у которого поставить RunOn=Client. В коде же (метод promptPrim) идет проверка - что если класс запущен на сервере и нет ограничений для создания копии себя на клиенте - то создается копия себя на клиенте. А если класс запущен изначально на клиенте - то копия класса не создается в принципе.
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 13.09.2010 в 14:15. |
|
13.09.2010, 14:30 | #9 |
----------------
|
Цитата:
Сообщение от sukhanchik
Вообще-то - для кода один фиг - как он был вызван на сервере - при помощи установки свойства RunOn у менюитема, у класса или жестко зашит в construct.
... В коде же (метод promptPrim) идет проверка - что если класс запущен на сервере и нет ограничений для создания копии себя на клиенте - то создается копия себя на клиенте. А если класс запущен изначально на клиенте - то копия класса не создается в принципе. и видим, что копия делается только если класс CalledFrom |
|
13.09.2010, 14:37 | #10 |
Administrator
|
Цитата:
__________________
Возможно сделать все. Вопрос времени |
|
13.09.2010, 14:38 | #11 |
Administrator
|
Цитата:
Сообщение от Wamr
Прошу прощения за формулировки вопросов.
1. имелся в виду "один из параметров, который выводится в диалог и пользователь может его сменить". То что args в main принесет мне данные, я понимаю. Что дальше с ними делать? Пихать в объект через parm метод? А как к этому отнесется getLast при вызове диалога (известно как потрет нафиг)? Цитата:
Если параметр сохранять нужно - то тогда вопрос - а что первичнее - сохраненное или заданное значение? На самый крайний случай - можно делать совсем просто. Кто сказал, что наследник runBase должен быть серверным? Пусть он будет клиентским. А вот метод run можно запустить и на сервере. X++: static void main(Args _args) { RunBaseClass runClass; RunBaseClass runClassServer; runClass = new RunBaseClass(); if (runClass.prompt()) { runClassServer = RunBase::makeObjectOnServer(classidget(runClass)); runClassServer.unpack(runClass.pack()); runClassServer.parmXXX(runClass.parmXXX()); // Или еще как-то проинициализировать параметры runClassServer.run(); } }
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 14.09.2010 в 09:06. Причина: Очепяточка |
|
|
За это сообщение автора поблагодарили: Wamr (3). |
13.09.2010, 14:51 | #12 |
Роман Долгополов (RDOL)
|
Цитата:
Сообщение от sukhanchik
Обычно я всегда задаюсь предварительно вопросом - а нужно ли мне этот параметр сохранять? Если параметр сохранять не нужно - то в методе unpack() на этот конкретный параметр можно поставить условие - если параметр пустой - то его "распаковывать", если нет - не "распаковывать". Хорошо подходит, если параметр - курсор. Плохо подходит - если параметр - енум или какое-то значение, которое может быть пустым вполне осознанно.
Если параметр сохранять нужно - то тогда вопрос - а что первичнее - сохраненное или заданное значение? Что значит не сохранять? Класс может переходить с клиента на сервер и обратно. Класс можно запустить в пакетную обработку. И как оно будет жить все если что то там не полностью сохраняется? |
|
13.09.2010, 15:08 | #13 |
Administrator
|
Цитата:
Класс сам по себе не переходит между сервером и клиентом. За это отвечает программист. Кстати - заметь - я не отказываюсь от сохранения. Я корректирую загрузку. В пакетную обработку класс может уходить. Дык это же никому не мешает.
__________________
Возможно сделать все. Вопрос времени |
|
13.09.2010, 15:15 | #14 |
Роман Долгополов (RDOL)
|
А вот за параметры-курсоры в том виде как их обычно лабают надо вообще руки отрывать. Ибо просто суют некий курсор в класс через parm-метод, а потов run() как то его юзают/обновляют.
Мало того что за время с момента вызова диалога и до фактического запуска обработки данные в бд на которые указывает этот курсор могли поменяться ,так еще и юзер вызвав диалог на одной строчке чего либо может вернуться в форму (не закрывая диалога) ткнуть в другую строчку (по любой причине - ну мало ли что ему там приспичило посмотреть) и потом нажать ОК на диалоге. Обработка будет выполнена по другой строке со всеми вытекающими последствиями. А так как авторы подобных обработок обычно всю проверку возможности выполнения их операций вещают на enable() менюайтема то последствия бывают просто разрушительными Это я к тому что (за исключением особо хитрых обработчиков где все вышеуказанное учетно и обдумано)
|
|
|
За это сообщение автора поблагодарили: sukhanchik (3), ziva (1). |
13.09.2010, 15:26 | #15 |
Роман Долгополов (RDOL)
|
Цитата:
Сообщение от sukhanchik
Не сохранять - означает - что вызов класса с использованием сохраненного значения параметра не планируется. Отказ от сохранения может быть реализован как отказ от загрузки, а не напрямую отказ от сохранения.
Класс сам по себе не переходит между сервером и клиентом. За это отвечает программист. Кстати - заметь - я не отказываюсь от сохранения. Я корректирую загрузку. В пакетную обработку класс может уходить. Дык это же никому не мешает. Енумы можно определять как пустые (если соответствующего значения нет) по значению 255. Завести где нито макрос/метод класса/глобальную функцию которая это будет возвращать и в нужных местах инициализировать/сравнивать. 255 не может быть у енума ни в каком случае (если не ошибаюсь, то последнее допустимое 250). Ну а присвоить в енум число ни что не запрещает. Это как раз к вопросу (видел тут некоторое время назад пост про нулевые значения на енумах и обязательность енумов в полях) что значения типа None в енумах все таки полезны Последний раз редактировалось db; 13.09.2010 в 15:32. |
|
13.09.2010, 15:32 | #16 |
Administrator
|
Цитата:
С этим безусловно не поспоришь - факт есть факт. Это менее критично - когда строится отчет - на худой конец отчет просто построится не по той записи, если это не принципиально для отчета. Но если класс из кода вызывается и запись жестко выбрана в коде - то с такими ограничениями - код работать сможет корректно. Кстати - также ж можно не только курсор передавать. Я курсор привел в качестве примера нескалярного типа данных. Это ж и экземпляр класса может быть. При желании.
__________________
Возможно сделать все. Вопрос времени |
|
13.09.2010, 15:32 | #17 |
Ищущий знания...
|
Цитата:
Сообщение от db
...
Енумы можно определять как пустые (если соответствующего значения нет) по цифре 255. Завести где нито макрос/метод класса/глобальную функцию которая это будет возвращать и в нужных местах инициализировать/сравнивать. 255 не может быть у енума ни в каком случае (если не ошибаюсь, то последнее допустимое 250). ...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
13.09.2010, 15:36 | #18 |
Роман Долгополов (RDOL)
|
Цитата:
Дополнение. Имелся ввиду не макрос метод в каждом обработчике, а нечто одно на всю аксапту. Макрос который живет в AOT, статический метод, ф-ия в Global Последний раз редактировалось db; 13.09.2010 в 15:40. |
|
13.09.2010, 15:49 | #19 |
Administrator
|
Забил ногами Даже возражать не собираюсь. Сдаюсь
__________________
Возможно сделать все. Вопрос времени |
|
13.09.2010, 15:51 | #20 |
Ищущий знания...
|
Цитата:
На мой взгляд лучше подумать при создании enuma как он будет использоваться, в каких случаях по нему будут выполняться сравнительные действия, и уже продумать использовать в нем нулевой элемент, или нет. Итого: на мой взгляд в Enum-параметрах лучше не использовать нулевой элемент.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: MikeR (4). |