27.12.2002, 14:17 | #1 |
Administrator
|
Как удалить DataSource из Query???
Опять вопрос знатокам Query в AXAPTA. Использую Query и Build-классы.
У меня есть DataSource в этом Query, который я бы хотел удалить. Как? Метод delete() не делает ничего!
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
27.12.2002, 14:22 | #2 |
----------------
|
Никак
|
|
27.12.2002, 14:49 | #3 |
Участник
|
Странный вопрос, Максим.
По определению, Query состоит из Datasource и методов. Если удалить Datasource, то получится что угодно, но не Query. Может ты хотел спросить как удалить таблицу из Query Datasource? |
|
27.12.2002, 15:06 | #4 |
----------------
|
mazzy, я думаю, имелось ввиду "Есть ли метод обратный addDataSource?"
|
|
|
За это сообщение автора поблагодарили: jeky (1). |
27.12.2002, 15:48 | #5 |
Участник
|
Можно только перестроить Query "с нуля", но уже без ненужного dataSource
|
|
27.12.2002, 18:21 | #6 |
NavAx
|
Ещё пару вопросов на эту тему.
1.)Есть форма, в ней datasource. Можно ли как-то изменить dataSource.table()? Что-то типа как в SysTableBrowser, но при уже запущенной форме. 2.)Можно ли удалять элементы из грида?
__________________
С уважением, Игорь Ласийчук. |
|
30.12.2002, 15:36 | #7 |
Участник
|
1.
В SysTableBrowser нельзя изменитиь таблицу во время выполнения. Я пытался изменить dataSource.table() при запущенной форме, но у меня ничего не получиллось. Пришёл к выводу, что во время инициализации формы формируется структура полей Датасорса, которую потом нельзя изменить. Можно изменить таблицу до запуска формы. 2. Колонки можно делать invisible :-) |
|
30.12.2002, 16:02 | #8 |
NavAx
|
1. При изменении dataSource.table() в query().dataSourceNo(1).table - остаётся прежней.
У меня тоже не получилось это сделать . После n-ного падания Аксапты сдался. А у rumpleteaser -а после подобных экспериментов исчез проект . Точнее проект-то остался, но вот зайти в него нельзя. 2. Если бы удалось реализовать п.1, то интересно бы было динамически формировать грид. Если просто колонки делать invisible их через некоторое время столько накопится...
__________________
С уважением, Игорь Ласийчук. |
|
08.01.2003, 11:16 | #9 |
Administrator
|
Цитата:
Изначально опубликовано Axapta
Можно только перестроить Query "с нуля", но уже без ненужного dataSource Любые замечания и предложения по исправлению ошибок принимаются и приветствуются.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
|
За это сообщение автора поблагодарили: jasper (1). |
31.08.2008, 23:27 | #10 |
Участник
|
Работает отлично. Одно дополнение: после копирования linkCount() - добавил также копирование dynalinks в новый query.
X++: for (i = 1; i <= source.linkCount(); i++) { dest.addLink(source.link(i).field(), source.link(i).relatedField()); } //31.08.2008 DMV-ruk added dynalinks for (i = 1; i <= source.dynalinkCount(); i++) { dest.addDynalink(source.dynalink(i).field(), source.dynalink(i).cursor(),source.dynalink(i).dynamicField()); } |
|
31.08.2008, 23:47 | #11 |
Member
|
Мне, обычно, хватало
qbds.enabled(false); Есть мнение, что капитальная перестройка query на лету может быть неоптимальным решением задачи. А можно привести пример, для чего такое понадобилось?
__________________
С уважением, glibs® |
|
|
За это сообщение автора поблагодарили: wef (1), Sergey Petrov (1). |
01.09.2008, 11:07 | #12 |
Участник
|
надо на форме Customer -> Customer transactions - добавить фильтр по display методу - а точнее - сделать existJoin с CustInvoiceJour для определённого значения одного (самодельного) поля в CustInvoiceJour.
То есть когда пользователь вводит (выбирает) что нить в поле фильтра - то сразу к CustTrans в коде добавляется existJoin с CustInvoiveJour - и когда очищает поле фильтра - то CustInvoiceJour удаляется из query. Когда я прямо в query на форме добавил CustInvoiceJour и пытался выставлять св-ва CustInvoiceJour_ds - то ничего не работало - а используя вышекпомянутый код удаления всё ОК. |
|
01.09.2008, 11:13 | #13 |
Участник
|
|
|
01.09.2008, 11:29 | #14 |
Участник
|
Цитата:
Сообщение от rkorchagin
надо на форме Customer -> Customer transactions - добавить фильтр по display методу - а точнее - сделать existJoin с CustInvoiceJour для определённого значения одного (самодельного) поля в CustInvoiceJour.
То есть когда пользователь вводит (выбирает) что нить в поле фильтра - то сразу к CustTrans в коде добавляется existJoin с CustInvoiveJour - и когда очищает поле фильтра - то CustInvoiceJour удаляется из query. Когда я прямо в query на форме добавил CustInvoiceJour и пытался выставлять св-ва CustInvoiceJour_ds - то ничего не работало - а используя вышекпомянутый код удаления всё ОК. Далее будет следующая задача от пользователей - показать как образовалась сумма в dysplay-поле. В результате вы все равно будете делать кнопку, которая будет открывать форму с CustInvoiceJour. Дык, вместо того, чтобы по-программистски извращаться и издеваться над пользователями, стоило чуток подумать: людям не нужны "фильтры", людям не нужны датасорсы и людям не нужно удаление датасорсов (они даже слов то таких не знают). ЛЮДЯМ нужно найти какую-то информацию, чтобы работать с ней (искать, смотреть, печатать). Что вы сейчас сделали? Вы изнасиловали систему в особо жестокой форме, при этом вы еще НЕ решили задачу ваших пользователей. Вы всего лишь дали поиск по дисплей-полю. Опять же таки - пользователи даже слов то таких не знают. А как будут работать пользователи дальше? Обратите внимание на постановку задачи - постановка сделана сугубо в программистских терминах. Если перевести постановку на человеческий язык, то пользователям нужно дать возможность искать что-то в накладных. Так? Причем это что-то вы даете ему из проводок. Зачем так? Может быть дать возможность СРАЗУ открывать накладные (это уже есть в стандартном функционале), каким-то образом фильтровать накладные, а затем переходить к проводкам из накладных (это тоже есть в стандартном функционале). Может быть я опять чего не догоняю. Но снова вижу типичный пример совершенно тупого и бесполезного кодинга. Который является результатом соверенно тупой постановки задачи. (стопудово в оправдание мне будут говорить, что форма CustTrans сильно кастомизирована, на эту форму навешано куча кастомизированного функционала и куча фильтров, в результате эту можно открыть только из клиента, а из остальных мест она не вызывается, а также что пользователи обучены ходить только так... блин, грустно... Поздравляю всех с днем знаний.) |
|
|
За это сообщение автора поблагодарили: oip (4). |
01.09.2008, 11:48 | #15 |
Участник
|
там сделан самодельный модуль по логистике - он связан с CustInvoiceJour и надо фильтровать какие записи CustTrans уже связаны с этим модулем через CustInvoiceJour - чтобы потом привязать остальные
Постановка задачи была: "нам нужен фильтр по этому полю" - так что в программистких терминах определил её я сам. |
|
01.09.2008, 11:52 | #16 |
Участник
|
ясно
Это еще не на человеческом языке. Пользователям то что нужно? |
|
01.09.2008, 12:01 | #17 |
Участник
|
задание ставил консультант - что надо пользователям - не знаю - хотят фильтр!
И раз название темы всё таки "Как удалить datasource из Query" Привожу полный работающий код ещё раз: X++: public static Query deleteDataSource(Query query, QueryBuildDataSource dataSource) { Query result; QueryBuildDataSource dSource; int idx; boolean isEqual(QueryBuildDataSource A, QueryBuildDataSource B) { return (A.name() == B.name()) && (A.table() == B.table()); } QueryBuildDataSource copyDataSource(QueryBuildDataSource dest, QueryBuildDataSource source) { QueryBuildRange range; int i; for (i = 1; i <= source.linkCount(); i++) { dest.addLink(source.link(i).field(), source.link(i).relatedField()); } //31.08.2008 DMV-ruk added dynalinks for (i = 1; i <= source.dynalinkCount(); i++) { dest.addDynalink(source.dynalink(i).field(), source.dynalink(i).cursor(),source.dynalink(i).dynamicField()); } for (i = 1; i <= source.rangeCount(); i++) { range = dest.addRange(source.range(i).field()); range.value(source.range(i).value()); range.name(source.range(i).name()); range.status(source.range(i).status()); range.label(source.range(i).label()); range.enabled(source.range(i).enabled()); } for (i = 1; i <= source.sortFieldCount(); i++) { dest.addSortField(source.sortField(i), source.sortDirection(i)); } for (i = 1; i <= source.sortIndexCount(); i++) { dest.addSortIndex(source.sortIndex(i)); } dest.fields().dynamic(source.fields().dynamic()); if (!dest.fields().dynamic()) { dest.fields().clearFieldList(); for (i = 1; i <= source.fields().fieldCount(); i++) { dest.fields().addField(source.fields().field(i), source.fields().fieldKind(i)); } } return dest; } void delete(QueryBuildDataSource topOrig, QueryBuildDataSource topRes) { int i; for (i = 1; i <= topOrig.childDataSourceCount(); i++) { if (!isEqual(topOrig.childDataSourceNo(i), dataSource)) { delete(topOrig.childDataSourceNo(i), copyDataSource(topRes.addDataSource(topOrig.childDataSourceNo(i).table(), topOrig.childDataSourceNo(i).name()), topOrig.childDataSourceNo(i))); } } } result = new Query(); for (idx = 1; idx <= query.dataSourceCount(); idx++) { dSource = query.dataSourceNo(idx); if (dSource.level() == 1) { if (!(isEqual(dSource, dataSource))) { delete(query.dataSourceNo(idx), copyDataSource(result.addDataSource(query.dataSourceNo(idx).table(), query.dataSourceNo(idx).name()), query.dataSourceNo(idx))); } } } return result; } |
|
|
За это сообщение автора поблагодарили: mazzy (1). |
01.09.2008, 14:00 | #18 |
Administrator
|
Безотносительно к первоначальной теме топика: осмелюсь предположить, что юзерам все же вряд ли нужен список клиентов, имеющих накладные в определенном статусе. Скорее всего, им все же нужен список этих накладных
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
Теги |
query |
|
|