|
|
#1 |
|
Участник
|
В одном гриде связаны два датасорса по OuterJoin
таблица "Действие" и таблица "Детализация действия". В обеих таблицах есть поле Комментарий. Задача в гриде сделать поле в котором будет показан Комментарий из таблицы "Детализация действия", а в случае если "Детализация действия" - не существует показать Комментарий из таблицы "Действие" Как такое реализовать? И реализуемо ли это вообще? Мозг сломал
|
|
|
|
|
#2 |
|
Участник
|
У табличного буфера есть методы joinChild()/joinParent(), по ним можно получить связанный черезе запрос буфер другой таблицы.
|
|
|
|
| За это сообщение автора поблагодарили: Logger (3). | |
|
|
#3 |
|
Участник
|
А не лучше ли создать новый display метод на таблице с детализацией?
X++: display Comment comment() { ActionTable actionTable; Comment comment; if (this.Comment != '') { comment = this.Comment; } else { select firstonly Comment from actionTable where this.ActionId == actionTable.ActionId; comment = actiontable.Comment; } return comment; } Последний раз редактировалось Stitch_MS; 10.10.2013 в 14:04. Причина: протупил |
|
|
|
|
#4 |
|
Участник
|
Цитата:
Сообщение от Stitch_MS
А не лучше ли создать новый display метод на таблице с детализацией?
X++: display Comment comment() { ActionTable actionTable; Comment comment; if (this.Comment != '') { comment = this.Comment; } else { select firstonly Comment from actionTable where this.ActionId == actionTable.ActionId; comment = actiontable.Comment; } return comment; } условие вывода скорее такое X++: if (this.RecId) { comment = this.Comment; } else { select firstonly Comment from actionTable where this.ActionId == actionTable.ActionId; comment = actiontable.Comment; //но в том-то и беда что записи this в этом случае нет - this.ActionId всегда будет "" } |
|
|
|
|
#5 |
|
Участник
|
joinChild()/joinParent(), не нашел как достучаться из дисплейметода на датасорсе
пытался X++: display Comment(ActionDetailTable _actionDetailTable)
{
ActionTable actionTable;
;
actionTable = _actionDetailTable.dataSource().cursor().joinParent();
} |
|
|
|
|
#6 |
|
Участник
|
В SQL это было бы так:
X++: select isNull(detailTable.Comment, actionTable.Comment) as comment from actionTable left outer join detailTable on actionTable.ActionId = detailTable.ActionId |
|
|
|
|
#7 |
|
Участник
|
Цитата:
А в обратном направлении идти пробовали? display Comment(ActionTable _actionTable) { ActionDetailTable actionDetailTable; ; actionDetailTable= _actionTable.dataSource().cursor().joinChild(); if (actionDetailTable.Comment ........ } Последний раз редактировалось Stitch_MS; 10.10.2013 в 15:11. Причина: опечатка |
|
|
|
|
#8 |
|
NavAx
|
Для понимания работы joinChild()/joinParent()
X++: static void Job51(Args _args) { InventTable InventTable, InventTableParent; InventSum InventSum; int i; ; while select InventTable join InventSum where InventSum.ItemId == InventTable.ItemId { i++; InventTableParent = InventSum.joinParent(); print(InventTable.RecId == InventTableParent.RecId); if (i >= 10) { break; } } } X++: display Comment(ActionDetailTable _actionDetailTable)
{
ActionTable actionTableLocal;
;
actionTableLocal = _actionDetailTable.joinParent();
....
} |
|
|
|
|
#9 |
|
Участник
|
Цитата:
Курсор datasource'а - это текущая выбранная на гриде запись, к которой кнопки привязаны и проч., а display-методы отображают данные для кучи записей на гриде, именно поэтому display-методу на datasource передается буфер, для которого он должен что-то отобразить, и который может не быть текущей выбранной записью. Поэтому надо, во-первых, дергать метод joinChild на действии, а не joinParent на детализации, а во-вторых, дергать на переданном буфере, а не на курсоре formDS. Я вот щас на коленке сделал форму CustTable outer join CustTrans, где display-методом вывожу либо CustTrans.RecId, если он есть, либо CustTable.RecId. Вот код метода:X++: display Description test(CustTable _custTable) { CustTrans ct = _custTable.joinChild(); RecId id = ct.RecId ? ct.RecId : _custTable.RecId; Description ret = strfmt('%1 %2', id, ct.RecId ? 'trans' : 'table'); return ret; } |
|
|
|
| За это сообщение автора поблагодарили: ex3em (1). | |
|
|
#10 |
|
Участник
|
Ура!! Заработало, Спасибо что указали где искать. не заметил что у входного параметра сразу есть joinChild()/joinParent(). Вот и начал извращенно лезть правой рукой к левому уху ![]() на OuterJoin если из чилд датасорса лезть по _actionDetailTable.joinParent(); не получается, похоже из-за отсутствия в чилде записи. а вот наоборот получилось. В паренте метод и из него лезть к чилду и проверять есть у него RecId - если есть то коммент чилда. Иначе комент парента. Огромное человеческое спасибо всем
|
|
|
|
|
#11 |
|
Участник
|
|
|
|
|
| За это сообщение автора поблагодарили: gl00mie (1). | |