30.09.2010, 20:43 | #1 |
Участник
|
Альтернатива 7-ми табличным датасоурсам
Доброго времени суток!
Хотелось бы узнать ваше мнение относительно моей задачи. Существует форма с двумя гридами (верхний и нижний). В верхнем гриде должны отображаться поля из 4-х таблиц, в нижнем - из 3-х. Некоторые из полей должны иметь возможность редактирования. Однозначно не могу решить, что лучше использовать с точки зрения быстродействия - представление, временную таблицу или оставить совокупность связанных табличных источников данных. Какими стандартными средствами среды MorphX можно заменить эти 7 табличных датасоурсов, связанных между собой?
__________________
С уважением, Александр. |
|
30.09.2010, 21:32 | #2 |
Administrator
|
Есть еще вариант (если конечно идеологически подходит). Одна постоянная таблица и кнопка "Разноска" (или ее аналог). По нажатию кнопки данные "раскидываются" по всем нужным таблицам.
Кстати - это самый что ни на есть штатный подход. Что такое разноска в ГК? Как раз формирование записей в нескольких таблицах. Еще пример - разноска журнала коммерческих соглашений. "Имитирование" разноски для возможности запрета правки основной таблицы.
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: Logger (1). |
30.09.2010, 22:15 | #3 |
MCP
|
Цитата:
Сообщение от samolalex
Доброго времени суток!
Хотелось бы узнать ваше мнение относительно моей задачи. Существует форма с двумя гридами (верхний и нижний). В верхнем гриде должны отображаться поля из 4-х таблиц, в нижнем - из 3-х. Некоторые из полей должны иметь возможность редактирования. Однозначно не могу решить, что лучше использовать с точки зрения быстродействия - представление, временную таблицу или оставить совокупность связанных табличных источников данных. Какими стандартными средствами среды MorphX можно заменить эти 7 табличных датасоурсов, связанных между собой? |
|
|
За это сообщение автора поблагодарили: samolalex (1). |
30.09.2010, 22:27 | #4 |
Участник
|
А можно ли создавать edit-методы на датасоурсах, вроде как, они создаются только на таблицах в отличие от дисплейных методов? Дело в том, что не хотелось бы создавать новые методы на существующих таблицах.
__________________
С уважением, Александр. |
|
30.09.2010, 22:32 | #5 |
MCP
|
конечно можно, программный код, написанный на датасорсе выполняется на сервере (если я ничего не путаю, это даже BestPractice). Если датасорса 4 ради 5-ти полей - легче использовать edit методы. Однако надо помнить, что по edit-полю у вас не будет работать фильтр и поиск
|
|
30.09.2010, 22:40 | #6 |
MCP
|
...сейчас нет аксапты под рукой, но например на форме фактур подставляется картинка (источник фактуры), эта картинка - пример работы display метода (он вроде на datasource FactureJour_RU написан в тройке), чрезвычайно удобно!
|
|
30.09.2010, 22:53 | #7 |
Administrator
|
Их можно делать как на датасорсах, так и на самой контрольке и даже на форме в целом.
А также при сложных вычислениях или большом обилии дисплей/едит методов - тормоза ...
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: samolalex (1). |
01.10.2010, 08:57 | #8 |
Участник
|
Если я чего-то не путаю, то все методы формы выполняются на клиенте.
|
|
01.10.2010, 09:00 | #9 |
MCP
|
Даа... бывают формы, ну совсем уж перегруженные дисплейными/едит методами, например та же форма фактур. Лучше избегать использования в этих методах конструкций вроде while select по большой таблице. Хотя есть положительная сторона вопроса - display/edit отрабатывают только для видимой части выбранных данных. Т.е. только для тех строк в grid, которые видит пользователь
|
|
01.10.2010, 09:03 | #10 |
Участник
|
Цитата:
Сообщение от samolalex
Доброго времени суток!
Хотелось бы узнать ваше мнение относительно моей задачи. Существует форма с двумя гридами (верхний и нижний). В верхнем гриде должны отображаться поля из 4-х таблиц, в нижнем - из 3-х. Некоторые из полей должны иметь возможность редактирования. Однозначно не могу решить, что лучше использовать с точки зрения быстродействия - представление, временную таблицу или оставить совокупность связанных табличных источников данных. Какими стандартными средствами среды MorphX можно заменить эти 7 табличных датасоурсов, связанных между собой? |
|
01.10.2010, 09:05 | #11 |
MCP
|
|
|
01.10.2010, 09:07 | #12 |
Участник
|
Цитата:
X++: info(enum2str(xGlobal::clientKind())); UPD: Поглядел, что у вас нет Аксапты под рукой. Последний раз редактировалось tricky; 01.10.2010 в 09:12. |
|
|
За это сообщение автора поблагодарили: kornix (1). |
01.10.2010, 09:15 | #13 |
MCP
|
|
|
01.10.2010, 11:02 | #14 |
Участник
|
Несмотря на то, что редактирование полей оказалось ненужным, необходимо наличие фильтров практически по всем полям на gride, поэтому использовать edit и display методы не получится.
Решил использовать временную таблицу с необходимыми полями в качестве датасоурса, в init формы буду ее заполнять результатом сложного запроса. Мне кажется, что применение View не является столь гибким инструментом для отображения результатов сложного запроса по 4-м таблицам (для верхнего грида) в отличие от временной таблицы.
__________________
С уважением, Александр. Последний раз редактировалось samolalex; 01.10.2010 в 11:08. |
|
01.10.2010, 11:18 | #15 |
Участник
|
Цитата:
Сообщение от samolalex
Несмотря на то, что редактирование полей оказалось ненужным, необходимо наличие фильтров практически по всем полям на gride, поэтому использовать edit и display методы не получится.
Решил использовать временную таблицу с необходимыми полями в качестве датасоурса, в init формы буду ее заполнять результатом сложного запроса. Мне кажется, что применение View не является столь гибким инструментом для отображения результатов сложного запроса по 4-м таблицам (для верхнего грида) в отличие от временной таблицы. На сколько я понял, к этой временной таблице вы будете джойнить "нормальные" таблицы (данные из другого грида)? В этом случае, вероятнее всего вы получите table scan по этим таблицам (источник: Оптимизация запроса - ranges). Да и измененные пользователем данные придется записывать в БД - а это только усложняет алгоритм работы формы. |
|
|
За это сообщение автора поблагодарили: samolalex (1). |
01.10.2010, 17:53 | #16 |
Участник
|
Задачу решил использованием двух временных таблиц - для верхнего и для нижнего гридов:
1) В первую таблицу "накидал" поля из 4-таблиц, во вторую - из 3-х. 2) В ветке датасоурсов формы связал по типу Delayed. 3) Для каждой таблицы написал серверный статический метод для их заполнения путем выполения x++ запросов. 4) В методе init формы вызываю в соответствующем порядке каждый из вышеуказанных методов. В итоге все работает стабильно и достаточно быстро (относительно заполнености таблиц). Остался небольшой вопрос - является ли "адекватным" (регламентированным в среде MorphX) решением использование 2-х временных таблиц в качестве датасоурсов с точки зрения контекста поставленной мною задачи?
__________________
С уважением, Александр. |
|
01.10.2010, 18:50 | #17 |
Administrator
|
Цитата:
Поэтому - можно предложить следующие варианты: 1. Выбрать какую-то одну таблицу в качестве основной и сделать несколько едит-методов для доступа данных к полям других таблиц. "-" если едит-методов будет много (>5-6) - возможно ощущение тормозов. Хотя все зависит от размера таблиц, к которым обращается едит-метод - насколько запрос долгий. Также нет сортировки и фильтрации "+" быстрая разработка, удобство в актуальности значений полей и отсутствия необходимости дополнительно обновлять данные. 2. Создать временные таблицы, в которых накидать те поля, которые нужны для отображения в форме. "-" таблицы нужно заполнять при открытии формы и их содержимое нужно обратно "раскидывать" при закрытии формы. Если в таблицах будет содержаться > 30-40 записей - то просядет время открытия формы - т.к. если у постоянных таблиц в грид подгружается только видимое количество записей при открытии + 30 записей (т.е. порядка 40 записей) - то тут Вам нужно будет фактически записать в таблицы все записи, удовлетворяющие выборке из постоянной - чтобы сформировать нужный вариант. При этом, при закрытии формы возникает обратная задача - нужно снова обработать все записи, чтобы измененные данные внести в постоянные таблицы. "+" следа от использования временных таблиц не останется 3. Джойн таблиц, от чего Вы хотите отказаться. "-" большое количество таблиц (особенно если они объемные) сказывается на производительности "+" в грид подгружаются не все записи - а только видимая часть + 30 записей. Также не нужно загружать/раскидывать данные как в случае временных таблиц. 4. п.2, только с использованием постоянных в БД таблиц. "-" нужно прошерстить все изменения Вашего списка таблиц, чтобы в каждое изменение вставить копирование в Ваши таблицы. Либо предзаполнять создаваемые записи в форме. Помимо того, что это может быть просто неоправдано по логике - это естественно - не ускорит те процессы в которые Вы вклинитесь (например, если это разноска). А еще и увеличится время на разработку - т.к. нужно будет данные все равно подгружать и обратно раскидывать "+" скорость и удобство работы (фильтрация и пр.). Поэтому тут нужно смотреть по конкретной задаче. Если вводится первичный документ - то это однозначно п.4 с предзаполнением полей при создании записи (например, создание заказа на продажу и заполнение ряда полей из справочника клиентов при выборе клиента). Если данные нередактируемые - но нужно иметь их оперативно - то это п.4 со "вклиниванием" или п.3, если скорость приемлема. Аналог - расчет запасов в наличии - когда при изменении таблицы складских проводок (InventTrans) обновляется таблица запасов в наличии (InventSum) Если это корректировка (без создания) какого-либо документа с каким-то индивидуальным интерфейсом для пользователя - то возможны п.1 или п.3. Даже возможен п.4 - например - разноска журнала коммерческих соглашений для установки цены. Если таблица используется в мастере (Wizard) - то однозначно нужно иметь временные таблицы - чтобы в любой момент при нажатии пользователем кнопки отмены - состояние БД-бы не изменилось - это п.2
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 01.10.2010 в 18:59. |
|
01.10.2010, 20:06 | #18 |
Участник
|
Когда-то делали форму-запрос, где была куча джойнов (до 8) для получения нужного среза.
Кончилось тем, что переделали на временную таблицу, тк ее заполнение (даже с вложенными циклами) было быстрее, чем открытие такой формы (на пустых данных тормозило константное время на сам запрос). Соотв, нужно протестить полученный вариант из многих джойнов на скорость инициации формы. Джойнить две временные таблицы или временную с невременной черевато глюками, нормально работает связка реальная + временная. Но это смотря еще по каким полям это делать. Можно еще едитметодами эмулировать поля из других таблиц. А вообще 4 + 3 это не 7 подряд (и не 8 как у меня) Это штатное применение См форму Заказов тех же (уже не помню где конкретно, но точно видел) - там как раз 4 + 3 было строки+ аналитики + линки + че-то там еще Опять же сколько записей должно быть в подчиненной выборке, если 100000, то одно, если 10 - другое. Карточки номенклатур штатные 5 таблиц на форме, если обвешаны древовидным справочником, то как раз 6-7 и будет. То есть, все от работоспособности итогового результата. А так как проще сделать грид из связки, то так и нужно сделать - а потом уже оптимизировать, если придется вообще. Последний раз редактировалось BOAL; 01.10.2010 в 20:09. |
|
|
За это сообщение автора поблагодарили: samolalex (1). |
04.10.2010, 11:04 | #19 |
Участник
|
sukhanchik, из вашего сообщения сделал вывод, что в контексте моей задачи использование временных таблиц скорее склоняется в сторону "Нет", чем "Да".
Поэтому переделал форму: 1) Создал 2 вьюшки, в первую поместил 4 таблицы, а во вторую - 3; 2) Эти представления использую в качестве датасоурсов.
__________________
С уважением, Александр. Последний раз редактировалось samolalex; 04.10.2010 в 11:59. |
|
04.10.2010, 12:40 | #20 |
Administrator
|
Цитата:
А сборка данных из разных таблиц в одну пару временных таблиц для печати ТОРГ-12 - гораздо шустрее джойнов - т.к. временные таблицы заполняются небольшим количеством данных.
__________________
Возможно сделать все. Вопрос времени |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|