10.07.2006, 18:10 | #1 |
Участник
|
корректный вызов класса
Нужно написать класс:
он может вызываться по MI с текущей записи формы, а может по выбранным записям из другой формы(имеющей такой же DS как и предыдущая форма). Как корректней писать класс: 1) так. чтобы ему передавать в args.record текущую запись и соответственно, вызывая во второй форме циклично по выбранным: args.record(Table); new Menufunction(menuItemActionStr(MyMenuItem), MenuItemType::Action).run(args);. Меня тут смущает то,. что каждый раз содается новый экземпляр класса, что по идее накладно плюс при надобности я не могу обработать все записи в одной транзакции 2) написать так класс,чтобы его можно было 1 раз инициализировать, а потом уже передавать на обработку в цикле записи. 3) воспользоваться временными таблицами, recordSortedList-ами или set с идентификаторами записей |
|
11.07.2006, 10:40 | #2 |
Moderator
|
Через args.record().datasource() выходите на источник данных и в нем уже перебираете выделенные записи, если они есть, или используете текущую.
__________________
Андрей. |
|
11.07.2006, 11:20 | #3 |
Участник
|
текущую, значит, способом 1) ?
Возможен вариант, что класс вызывается из другого класса, где обрабатываются, допустим, закупки, а наш класс обрабатывает накладные. Тогда что делать? Циклично находить накладные по каждой закупке и передавать каждую запись в класс, создавая каждый раз новый экземпляр класса? Или как-нить по-другому? по сути, ситуация как и с формой, но что args.record().datasource() должен указывать? на временную таблицу со всеми отобранными по закупкам накладным? |
|
11.07.2006, 11:34 | #4 |
Moderator
|
Вам нужно создать иерархию классов, наподобие SalesAutoCreate* (может быть, не очень удачный пример, но ничего другого в голову не идет), написать фабричный метод, возвращающий соответствующего наследника в зависимости от переданной таблицы, и т.д... В двух словах не опишешь.
__________________
Андрей. |
|
11.07.2006, 11:47 | #5 |
Участник
|
Цитата:
Сообщение от kitty
Меня тут смущает то,. что каждый раз содается новый экземпляр класса, что по идее накладно
Цитата:
Сообщение от kitty
плюс при надобности я не могу обработать все записи в одной транзакции
Да, именно так написана вся Аксапта. Разработчики борются за снижение сложности разработки. За счет уменьшения производительности. Цитата:
Сообщение от kitty
2) написать так класс,чтобы его можно было 1 раз инициализировать, а потом уже передавать на обработку в цикле записи.
За счет чего снижается сложность разработки? = За счет того, что общий алгоритм (класс родитель) реализует общую часть, а детали и контестно-зависимые вещи передает потомкам. = Следовательно, потомки могут быть достаточно простыми - каждый из них реализует только свою особенность. В вашем случае класс-родитель должен предоставить общий алгоритм работы, а классы потомки должны указать детали обработки записей разных видов. Цитата:
Сообщение от kitty
3) воспользоваться временными таблицами, recordSortedList-ами или set с идентификаторами записей
Вы, похоже, привыкли работать с запросами СУБД. Почитайте про ООП и применение ООП при работе с СУБД. Почитайте плюсы и минусы... И еще: один большой СКЛ-запрос не всегда лучше нескольких маленьких. Особенно в многопользовательской системе. Подумайте над этим. |
|
11.07.2006, 11:48 | #6 |
Участник
|
Цитата:
Сообщение от Dron AKA andy
В двух словах не опишешь.
|
|
11.07.2006, 11:56 | #7 |
Участник
|
я ,наверное, не очень корректно описала проблему:
спасибо за пример. Мой класс не столь сложен, то есть он обрабатывает записи только одной таблицы(то есть как бы вид записей одинаков). Но, просто, в зависимости от того, откуда вызывается он должен обрабатывать не одну запись, а несколько. Вот я и думаю, как это лучше реализовать. Передавать ему по одной записи на обработку или сразу сделать так, чтобы он мог принимать набор записей (то есть, допустим, передавать ему извне уже заполненную врем таблицу). Хотя, если в одном месте передавать врем таблицу, то, видимо, как вы и сказали, придется делать 2 наследника - один реальные записи перебирает(если допустим со строк формы вызван(у которой ds это нужная нам таблица)), а другой наследник работает с времнной таблицей. Но чот сложно уж больно для такой типичной ситуации. Совсем запуталась =(. |
|
11.07.2006, 12:20 | #8 |
Участник
|
спасибо
на самом деле я тупила. думала, что транзакция PHP код:
Значит, буду так вызывать. Спасибо. |
|
11.07.2006, 12:55 | #9 |
Участник
|
а думала так, потому что если на форме кликаешь MI, а в методе clicked написать чо-нить типа
PHP код:
Может, объясните, напоследок, почему так происходит и только с формами ли или сам MI тоже так работает? Помню транзакции тоже обрываются, если форму в транзакции открывать. То есть форма будто вообще отдельным потоком выполняется. |
|
11.07.2006, 13:47 | #10 |
Moderator
|
1. В цикле дергать menuitem необязательно, и даже как-то некрасиво. Можно передать в класс предварительно отобранный select`ом набор записей и перебирать его командой next. И временная таблица тоже не нужна. Посмотрите внимательней на классы, кот. я рекомендовал раньше, напр. SalesAutoCreate_Basket.
2. Если через menuitem открывается форма, то система не ждет, пока форма закроется, и в clicked() после super() выполняются последующие команды. super() сделал свое дело - открыл форму, и ждать ее закрытия ему никто не говорил.
__________________
Андрей. |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Вызов метода базового класса | 15 | |||
Вызов класса из другого класса | 9 | |||
"Программный" вызов метода класса!? | 13 | |||
вызов класса с передачей параметров | 2 |
|