powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Набросал структуру для генерации GUI
63 сообщений из 63, показаны все 3 страниц
Набросал структуру для генерации GUI
    #38127278
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покритикуйте. Back-end, ессно. Ну, хотя бы взлетит - не взлетит.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
-- типы пунктов меню (folder, grid, procedure)
create table ui$menu_item_type (
  id varchar2(20) not null primary key, -- код типа
  name varchar2(100) not null -- название
);

-- пункты меню. Если тип включить в ПК, то ссылки с наследников будут более строгими - 
-- можно повесить check (ui$menu_item_grid.item_type='grid')
create table ui$menu_item (
  id integer not null primary key, -- код записи
  name varchar2(100) not null, -- текст
  parent integer references ui$menu_item(id), -- папка
  item_type varchar2(20) not null references ui$menu_item_type(id), -- тип пункта меню
  index integer not null, -- порядковый номер, для сортировки внутри папки
  custom_class varchar2(100) -- класс для отображения, для настройки более сложного поведения
);

-- простые типы данных
create table ui$data_type (
  id varchar2(20) not null primary key,
  name varchar2(100) not null -- название
);

-- возможные процедуры к вызову
create table ui$procedure (
  name varchar2(200) not null primary key, -- название (схема.пакет.процедура)
  custom_class varchar2(100) -- класс для отображения, для настройки более сложного поведения
);

-- описание датасета
create table ui$dataset (
  name varchar2(200) not null primary key, -- название
  select_procedure varchar2(200) not null references ui$procedure(name), -- курсор
  key_fields varchar2(100) not null, -- ключевые поля (через запятую, нарушение 1 НФ!)
  parent_field varchar2(100) -- поле предка, если иерархия
);

-- описание скаляра - поля набора данных или параметра процедуры
create table ui$scalar (
  id integer not null primary key, -- код записи
  name varchar2(100) not null, -- название
  user_name varchar2(100) not null, -- показываемое название
  data_type varchar2(20) not null references ui$data_type(id), -- тип данных
  links_to varchar2(200) references ui$dataset(name) -- ссылка на датасет для выбора значения. 
    -- вопрос, как быть с FK по более чем одному полю
);

-- описания параметров процедуры
create table ui$procedure_param (
  procedure varchar2(200) not null references ui$procedure(name), -- процедура
  param integer not null references ui$scalar(id), -- параметр
  required integer not null check (required in (0,1)), -- обязательность
  default_value varchar2(200), -- значение по умолчанию, кодированное, пока без подробностей
  primary key (procedure, param)
);

-- описание полей датасета для показа грида
create table ui$dataset_field (
  dataset varchar2(200) not null references ui$dataset(name), -- набор данных
  field integer not null references ui$scalar(id), -- поле
  visible integer not null default 1 check (visible in (0,1)), -- видимость
  index integer, -- порядковый номер для отображения
  group varchar2(100), -- имя группы, для показа бэнда
  primary key (dataset, field)
);

-- пункт меню типа "грид", наследник от ui$menu_item. Если нет процедур, то только просмотр. Он же и отчет.
create table ui$menu_item_grid (
  id integer not null primary key references ui$menu_item(id), -- код записи
  dataset varchar2(200) not null references ui$dataset(name), -- набор данных
  add_procedure varchar2(200) references ui$procedure, -- процедура добавления записи
  edit_procedure varchar2(200) references ui$procedure, -- процедура редактирования записи
  del_procedure varchar2(200) references ui$procedure, -- процедура удаления записи
);

-- пункт меню типа "процедура"
create table ui$menu_item_procedure (
  id integer not null primary key references ui$menu_item(id), -- код записи
  procedure not null varchar2(200) references ui$procedure -- процедура
);

-- бинд полей датасета к параметрам процедуры. 
-- вместе с ui$procedure_param описывает интерфейс вызов процедуры, например редактирования записи
create table ui$field_to_param (
  dataset varchar2(200) not null references ui$dataset(name), -- набор данных
  field integer not null references ui$scalar(id), -- поле
  procedure varchar2(200) not null references ui$procedure, -- процедура
  param integer references ui$scalar(id), -- параметр, если пуст то поле информационное
  read_only integer not null default 0 check (read_only in (0,1)), -- надо ли, с учетом существования пред. поля?
  visible integer not null default 1 check (visible in (0,1)), -- показывать
  index integer, -- порядковый номер в группе
  group varchar2(200), -- группа
  default_value varchar2(200), -- значение по умолчанию
  primary key (dataset, field, procedure)
);

-- какие процедуры можно вызывать напрямую из этого грида. бинды берутся из ui$field_to_param
-- дополнительные кнопки на гриде
create table ui$grid_proc (
  item integer not null primary key references ui$menu_item_grid(id), -- грид
  name varchar2(200) not null, -- текст кнопки
  procedure varchar2(200) not null references ui$procedure(name), -- процедура для вызова
  need_refresh integer not null default 0 check (need_refresh in (0,1)) -- нужно ли обновление грида после вызова
);

...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38127287
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это даже не нулевое, это минус тысячное приближение. Высасывать такие "генераторы" из пальца, по моему, дело абсолютно бесполезное и бесперспективное. Если бы у вас было за плечами создание конкретных прикладных систем и вы бы облегчали свой труд - замена программирование конфигурированием - тогда был бы шанс повторить путь искры или випроса.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38127320
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П-Л,

Если хотя бы 20% функционала будет определяться таким образом, я сочту вложение сил в эту систему оправданным. Никто же не мешает сделать тип "пункт меню произвольного класса без предварительного описания" и фигачить в нем какой угодно код для отображения чего и как угодно.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38127334
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, описание и сделано минималистичным для того, чтобы
- можно было создать наследников для конкретных форм и в них прописать необходимое дополнительное поведение
- не создавать соблазна раздувать систему декларации вплоть до попиксельного описания
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38127367
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из вашего скрипта просматриватеся только меню и простой плоский грид с данными. Это, простите, совсем уж убого.

Вы б начали с общей концепции дизайна интерфейса. Какие формы визуального отображения сложно устроенных данных вы предполагаете ? Могут ли они контейнироваться и как ? Как взаимодействуют друг с другом ?

Без ответов на эти вопросы ваши структуры данных будут висеть в сферическом вакууме.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38127479
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShrПокритикуйте. Back-end, ессно. Ну, хотя бы взлетит - не взлетит.
не взлетит. Шансов просто нет.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38127688
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видимо, я совсем неточно выразился. Я не предполагал полного описания интерфейса и построения его исключительно на данных из базы (этой схемы). Скорее, это возможность для быстрого создания простого, но функционально достаточного интерфейса типа показать/отредактировать плоский справочник с возможностью его дальнейшей доработки в коде клиента.

Вот вводные:
- Вся логика в базе, в процедурах, включая запросы для показа данных
- Клиент - сейчас толстый на delphi
- Есть набор базовых форм и классов (грид, редактор обьекта, вызов процедуры) со стандартной функциональносью
- Для каждой формы (реализации пункта меню) на данный момент есть наследник от стандартного класса, в коде которого и описано все поведение

Хочется повысить уровень абстракции:
- При создании нового режима описывать базовую функциональность в декларативном стиле для самых простых случаев (показ данных, процедуры, редактирование объектов). Желательно для процентов 30 тупых справочников не писать кода
- На этой же платформе описывать тот же интерфейс для реализации на внутреннем портале на php
- Для случаев посложнее все так же наследуемся и дописываем что надо в коде клиента

Далее, что касается сложно устроенных данных и агрегирования элементов интерфейса - тут, похоже, пока полный провал. Надо дальше думать. В текущей схеме есть только:
- ввод параметров процедуры
- вывод датасета
- связь между ними

В принципе, этого достаточно для блочной постройки интерфейса:
- собственно грид как результат вызова процедуры (ввод параметров)
- редактор со встроенным child-гридом
- мастер-деталь
- отчет или процедура, вызываемый на основе текущей записи грида

В схеме данных надо только выделить блоки, более строго сформулировать интерфейсы взаимодействия и добавить граф связей между блоками.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38127711
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот то-то и оно, что думать надо.

У меня, как и многих форумчан есть собственный велосипедик, везущий на себе ВСЕ тяготы презентационного слоя приложения. Для оживления данных во всех формах, открытия и переходах между формами с сохранением контекста, поиска и фильтрации данных кода не нужно ни одной строки - все за счет настройки. Обошлось это удовольствие в пару-тройку дюжин таблиц.

Но при этом есть определенная концепция интерфейса, в рамках которой надо находится для пользования этой способностью. Из дома смогу приложить принтскрин схемы данных и рабочего окна системы.

Мой более продвинутый коллега сделал идеологически такой же механизм на дот нете. Более красивый, мощный и удобный. Не знаю только, захочет ли он поучаствовать в этой ветке.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38127743
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, всю настройку в таблицы я класть не хочу. Тогда теряется возможность еще более тонкой настройки вроде связей между отдельными контролами либо в генератор интерфейса надо запихивать чуть ли ни каждую заказанную фичу (а у заказчиков богатая фантазия), что трудоемко, сильно засоряет декларации всякой мелочью, усложняет систему и её поддержку - в общем, не факт что в итоге оправдано. Короче, тут нужна золотая середина, и слишком большими шагами в её поисках я двигаться не буду.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38127932
Goffman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если система предназначена только редактирования "тупых" справочников, то может и взлетит,
так как , что либо сложнее с помощью такой системы вряд ли удастся построить.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38127944
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShrНет, всю настройку в таблицы я класть не хочу. Тогда теряется возможность еще более тонкой настройки вроде связей между отдельными контролами либо в генератор интерфейса надо запихивать чуть ли ни каждую заказанную фичу (а у заказчиков богатая фантазия), что трудоемко, сильно засоряет декларации всякой мелочью, усложняет систему и её поддержку - в общем, не факт что в итоге оправдано. Короче, тут нужна золотая середина, и слишком большими шагами в её поисках я двигаться не буду.
На мой взгляд вы сузили постановку задчи до недопустимо ничтожной величины. Смысла развивать топик в таком направлении я не вижу. Для практических целей такой "интерфейс" не тянет.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38128052
д
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
д
Гость
П-Л... Из дома смогу приложить принтскрин схемы данных и рабочего окна системы.
Мой более продвинутый коллега сделал идеологически такой же механизм на дот нете.
Более красивый, мощный и удобный. Не знаю только, захочет ли он поучаствовать в этой ветке.l!! даже, если ТС не откликнется на это - не забудьте !!!
думаю - я не одинок в этой просьбе


ТС - сорри




вау
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38128166
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программист-ЛюбительДля практических целей такой "интерфейс" не тянет.Он не тянул бы в случае коробочного решения, которое невозможно (ну, почти :) доработать ручками после выпуска. Мне не нужен путь искры, у меня не тот случай. В моем случае (внутрикорпоративная система) очень даже тянет, потому как расширяется в любую нужную сторону непосредственно в коде клиента.
Еще раз, ожидания простые - есть 20-30% форм будут создаваться без написания кода клиента - мне этого будет достаточно.
Тем более что в реализации по умолчанию будет и поиск и сортировка и фильтры и группировка и экспорт в 2-3 формата, и связи между отдельными наборами данных. Для чуть более чем плоских отчетов - понадобится дополнительное описание, конечно.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38128170
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробую описать еще разок.
Если представить шкалу развития автоматизации gui как:
1 - создание каждой формы с 0
10 - генерация gui полностью на основании описания, включая дизайнер непосредственно в приложении и скрипты как обработчики событий (искра)

то я хочу перейти с 3 (есть набор базовых классов и форм) на 4 (структура интерфейса описана в базе, некоторая часть его отображается без кода вообще) примерно стадию, дальше мне пока не надо.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38128252
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дП-Л... Из дома смогу приложить принтскрин схемы данных и рабочего окна системы.
Мой более продвинутый коллега сделал идеологически такой же механизм на дот нете.
Более красивый, мощный и удобный. Не знаю только, захочет ли он поучаствовать в этой ветке.l!! даже, если ТС не откликнется на это - не забудьте !!!
думаю - я не одинок в этой просьбе


ТС - сорри




вау
Теперь смогу только сегодня вечером...
В качестве компенсации пока расскажу/покажу на пальцах.
Прикладные формы трех типов.
Форма-карточка.
Имеет
- заголовок, в котором в сжатом виде выводится описание объекта (типа склееные номер, наименования),
- (опционально) область главных данных - небольшое количество наиболее важных полей.
- (опционально) набор вкладок. На каждой вкладке находится набор полей россыпью или вложенные таблицы детальных для текущего объекта данных (гриды). Вложенные таблицы имеют над собой (опционально) область “управляющих контролов” – комбобоксы для фильтрации, сортировки, строку ввода образца для мгновенного поиска.

Имеется возможность встраивать в форму-карточку "стандартные вкладки"
- один сгенерированый документ (ворд) определенного типа по данным текущей записи
- набор сгенерированных документов разных типов по данным текущей записи
- единственный вложенный документ (файл любого типа – тифф, пдф, …)
- набор вложенных документов (файлов любого типа)

Формирование документов ворд по данным бизнес-сущности настраивается. Есть всякие примочки для получения безукоризненных документов типа склонения ФИО в разных падежах, обращения г-н/г-жа, всякие суммы/проценты прописью и т.п.

Форма-таблица.
Имеет одну или несколько зон, на каждой зоне
- (опционально) область “управляющих контролов” – комбобоксы для фильтрации, сортировки, строку ввода образца для мгновенного поиска.
- (опционально) вложенную таблицу данных в табличном виде (грид).

Гриды разных зон могут (и, как правило чаще всего так и есть) связываться друг с другом как мастер-детальные.

Форма-структура.
Является неким аналогом проводника с деревом объектов в левой части и карточкой текущего узла в правой части. Для корневого уровня в правой части чаще всего выводится грид самых верхних объектов. При выборе какого-либо узла в левой части в правой части выводится форма-карточка именно этого объекта. Т.е. одна и та же форма-карточка объекта обычно используется дважды: как самостоятельная карточка и как правая часть в форме-структуре.

Формы-структуры оказались самыми удобными и наглядными для работы со сложными данными. Любой узел можно открыть в виде самостоятельной карточки. Из форм-таблиц текущая запись также практически всегда открывается как новая форма-карточка. Можно встроить карточку в форму-структуру: в верхней половине – список объектов, в нижней – карточка текущего объекта. Можно из текущей записи грида открывать разные карточки объектов, задействованных в данном гриде. Все команды открытия карточек тоже конфигурируются.

Из грида можно выгружать отчеты в эксель в разных форматах, плоские и ОЛАП. Выгрузка отчетов, разумеется, тоже настраивается.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38129677
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выполняю просьбу.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38129703
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Форма-конструктор прикладных форм. В ней открыта как раз она сама, как объект настройки/конфигурирования. Так сказать, ассемблер, написанный на ассемблере. Вкладок много, на каждой задаются данные по какому-либо аспекту конфигурирования.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38413979
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П-ЛВы б начали с общей концепции дизайна интерфейса. Какие формы визуального отображения сложно устроенных данных вы предполагаете ? Могут ли они контейнироваться и как ? Как взаимодействуют друг с другом ?
Пора, пожалуй.
Формы отображения (блоки интерфейса) бывают двух видов - отображение процедуры и формы.
Процедура - это фильтр (набор входных параметров) + грид (возможно дерево), если процедура возвращает курсор (набор данных) либо ввод параметров для её вызова.
Форма - это контейнер из блоков. Все блоки в форме привязаны к панелям, для задания вида отображения в виде иерархии.

Взаимодействие между блоками идет тремя способами.
Первый - это связи между блоками в форме (так реализуется мастер-деталь гриды, выбор значений параметров из грида и т.д).
Второй - это передача параметров (возможно в т.ч. и полей курсора) блока в другой вызываемый блок (т.н. действия в блоке). Вызов возможен по кнопке на панели либо по двойному щелчку в гриде, если блок - процедура с курсором.
Третий - ссылки из редактируемых параметров (выбор значений из справочников), тоже с возможной передачей параметров из текущего блока (или любого блока формы) в курсор.

Каждому параметру блока можно назначить отдельный вид редактора, если редактора по умолчанию не достаточно.
Каждому блоку можно указать нестандартный класс для его отображения, для его создания можно унаследоваться от стандартного и внести необходимые изменения.

Написаны процедуры для автоматической генерации интерфейса (включая код процедур редактирования и выборки) для редактирования таблицы, для отображения отдельной процедуры.

Пример дополнения блока (форма авторизации):

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
unit uAuthorizeFrame;

interface

uses
  ...

type
  TAuthorizeFrame = class (TProcedureFrame)
  private
    { Private declarations }
  public
    { Public declarations }
    procedure SetDefaultParamValues; override;
    function Save: boolean; override;
    procedure Build(AParent: TWinControl); override;
  end;

implementation

uses
  DateUtils,
  Avk.Gui.DefaultValueEditorFrame;

const
  cLoginParamName = 'I_LOGIN';
  cLoginSettingsName = 'LOGIN';

{$R *.dfm}

{ TAuthorizeFrame }

procedure TAuthorizeFrame.Build(AParent: TWinControl);
var
  E: TcxTextEdit;
begin
  inherited;
  E := ParamControls['I_PASSWORD'].GetEditor as TcxTextEdit;
  E.Properties.EchoMode := eemPassword;
  (Self.Owner as TForm).ActiveControl := E;
end;

function TAuthorizeFrame.Save: boolean;
begin
  Result := inherited Save;
  if Result then
    SaveFrameSettingsValue(cLoginSettingsName, VarToStr(ParamValues[cLoginParamName]));
end;

procedure TAuthorizeFrame.SetDefaultParamValues;
begin
  inherited;
  ParamValues.AddOrSetValue(cLoginParamName, LoadFrameSettingsValue(cLoginSettingsName));
end;

initialization
  RegisterClass(TAuthorizeFrame);

end.



Вид формы - редактора формы прикладываю.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415038
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shr,

добрый день!

Мне кажется вы не с того конца начали - вы начали с окончания, а нужно с начала. а началом является как правило БД - вот от ее структуры и надо плясать!
Для БД нужно создать мета-надстройку, которая вам и позволит создавать/конфигурировать любой интерфей любой интерфейс
тем более у вас есть коллеги-динозавры в этой области - www.arbinada.com - там ребята тоже на Делфи свои первые проекты писали, но они начинали с начала - с БД!
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415129
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spShr,

добрый день!

Мне кажется вы не с того конца начали - вы начали с окончания, а нужно с начала. а началом является как правило БД - вот от ее структуры и надо плясать!
Для БД нужно создать мета-надстройку, которая вам и позволит создавать/конфигурировать любой интерфей любой интерфейс
тем более у вас есть коллеги-динозавры в этой области - www.arbinada.com - там ребята тоже на Делфи свои первые проекты писали, но они начинали с начала - с БД!
Где начало а где конец - вопрос дискуссионный.

В реляционной структуре таблиц данные лежат в удобной для восприятия конечному пользовталею форме только в простейших случаях - тестовые и учебные проекты.

Как только в БД моделируется реальная практика жизни, модели резко усложняются и для расщепление бизнес-понятий на реляционные таблицы выполняется так, чтобы это правильно и логично для структуры данных, для программиста, но не для пользователя.

Поэтому при реализации интерфейса разработчику нужно потратить много сил, чтобы обеспечить переход от реляционной структуры таблиц к визуальной форме, которая наглядна и удобна с точки зрения бизнеса.

Для этого конструкторы/конфигураторы/построители форм должны иметь развитые средства, позволять на ходу менять визуальное представления данных (скрывать/высвечивать панели и вкладки, менять одну панель на другую, менять источники комбобоксов и т.п.). Т.е. в этом случае может иметь смысл идти именно от интерфейса, задавая для каждого его элемента биндинг на тот или иной источник данных из базы. Причем у этого биндинга должно быть много изощренных опций.

Поэтому когда я давно делал свой инструментарий я использовал такую парадигму. Моделирование структуры данных (таблицы, запросы, ф-ии, процедуры) в серверной части ведутся средствами сервера. Автоматических сборщиков запросов по модели нет. Все лапками.

Построение интерфейса тоже ведется средствами клиента. Тоже без автоматических построителей форм по опсианию таблиц или модели данных.

А в конфигураторе форм задается отображение данных в элементы интерфейса, правила поведения интерфейса. Т.е. форма делается как пустышка, но после настройки начинает жить, обеспечивая все функции презентации данных (включая открытие новых форм, переходы по связанным формам, сортировки, фильтры, загрузку нужных данных на вкладки, генерацию документов в ворде, привязку сканов первички, выгрузку отчетов в эксель и т.п.)

Это очевидно, не лучший путь, было сделано именно так по нескольким причинам: недостаток ресурсов - нужно было сделать быстро, уже имевшаяся система (1000+ форм) должна была быть перенесена на новый инструментарий.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415140
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spМне кажется вы не с того конца началиВы, кажется, чего-то не поняли. "Процедура" и "курсор" - это процедуры именно в БД, на psql или pl/sql - на данный момент поддерживаются Firebird и Oracle.

Т.е. сначала создаем структуру БД, потом формируем процедуры для редактирования и показа данных (простые можно сгенерировать), потом конфигурируем интерфейс для компоновки вида и установки связей между вызовами процедур БД.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415197
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П-Л, Shr ,

Чего там сложного - имея описания таблиц, связей, процедур, индексов - на основании этих данных уже можно автоматически генерить простые вью, которые на клиенте в соответствующем фреймворке MV* уже будут отреендерены.
Для кастомизации форм достаточно лишь незначительных изменений

Ничего особенно сложного тут нет - нужно время просто привести все это до кучи в мозгу сесть и написать)
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415204
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
статьи про первые попытки автоматически генерить интерфейсы CRUD были еще лет 7 назад на просторах вражеского инета, да и сейчас я думаю статей полно уже и на наших просторах - поищите
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415205
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС, можете показать принтскрины конечных пользовательских форм и на пальцах пояснить как они были сконфигурированы (настроены)
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415207
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, и обязательно! почитайте статьи на том сайте что я ранее указал, обязательно - очень помогает просветлению)
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415209
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spП-Л, Shr ,

Чего там сложного - имея описания таблиц, связей, процедур, индексов - на основании этих данных уже можно автоматически генерить простые вью, которые на клиенте в соответствующем фреймворке MV* уже будут отреендерены.
Для кастомизации форм достаточно лишь незначительных изменений

Ничего особенно сложного тут нет - нужно время просто привести все это до кучи в мозгу сесть и написать)
Категорически не согласен.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415270
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П-Л,

а вы и не соглашайтесь!
прочтите сначала что люди до вас поизобретали, а потом можно и окончательно не соглашаться :)
Я думаю тут Vipros мог бы вам оппонировать - у него давно свой фреймворк разработан именно на метамоделях - там весь интерфейс генерируется автоматически на основе метаописания базы данных + некоторые параметры настройки - поищите юзера такого у него в постах полно сложных форм в картинках из его фреймворка
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415301
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Метаописания Випроса - это как раз та очень существенная информация, которая может держать реальные сложные модели, используемые на практике. Я против вашего тезиса, что разработать подобное можно легко и быстро. Я против вашего тезиса, что по реляционной БД, используя стандартные словари реляционых СУБД (типа INFORMATION_SCHEMA.*) можно автоматически построить интерфейс, годный для практического применения. Это может сработать только на простых, учебных проектах.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415318
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spимея описания таблиц, связей, процедур, индексов - на основании этих данных уже можно автоматически генерить простые вью, которые на клиенте в соответствующем фреймворке MV* уже будут отреендерены.
Для кастомизации форм достаточно лишь незначительных измененийС таким подходом получается интерфейс, один в один отображающий физическую модель представления данных. Для работы пользователей он непригоден. Точнее, пригоден только для заполнения простых справочников.


П-ЛТС, можете показать принтскрины конечных пользовательских форм и на пальцах пояснить как они были сконфигурированы (настроены)
Скрин прикладываю. Вкладка "Цели департамента".
Конфигурация - форма, на ней одна панель с направлением вывода "сверху вниз".
На панели два блока с курсорами. У первой описаны параметры процедуры (они выводятся под иконками действий) и включена группировка в гриде (локальная) по двум полям.
Второй - связан с первым (входные параметры взяты из входных параметров первого), и в нем включен вид "вертикальное отображение".

Иконки редактирования и кнопки с текстом - вызовы других блоков с передачей параметров из текущего.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415329
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС, схема формы понятна. Рендеринг положения и размера контролов автоматический ? Как она конфигурируется ?
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415414
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Контролы для ввода фильтров - включено направлено отображения "горизонтальное", ширина одного поля ввода задается шириной фрейма его редактора. Высота панели для параметров фиксированная, для одной строки (условно).

Если будет задано "вертикальное", то контролы расширяются до ширины ParentWindows, высота определяется фреймом (видно в верхней части редактирования формы).

Расположение гридов (блоков) - задано направление "сверху вниз". Между гридами - сплиттер, двигается пользователем, сохраняется.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415445
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shr,

Ширина котнтролов для фильтрации разная. Если их будет много, как они размещаются на панели ? Листбоксы на несколько строчек возможны ?

Вечером из дома приложу несколько своих принтскринов для обсуждения некоторых вопросов.

Считаю, что у вас логичный подход и хорошая разработка.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415633
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П-Л,

я не писал что можно использовать существующую информацию в базе - я писал о создании мета надстройки
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415634
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П-ЛШирина котнтролов для фильтрации разная. Если их будет много, как они размещаются на панели ? Листбоксы на несколько строчек возможны ?
Сейчас - тупо не влезают по ширине. Да, листбоксы возможны, но в горизонтальном расположении будут ограничены по высоте стандартом.
В принципе, каждый контрол находится в отдельном фрейме с заданным минимальным размером, можно их перемещать на след. строчку при недостаточной ширине окна.
Также можно сделать вертикальное расположение и разместить панель фильтрации слева от грида.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415638
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shr,

ну и что тут такого невозможного?
Реализуете в БД систему раздачи прав на все объекты БД - таблицы, операции с ними.
Реализуете настройку меню как у вас в левой части и если есть необходимость - настройку рабочего стола!
Все это при наличии метамодели легко реализуется
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415647
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sp,

Никто не говорит про невозможность. Говорят о том, что реляционная структура данных не соответствует требуемому виду интерфейса пользователя. Поэтому "незначительными изменениями" отображения одного на другое добиться не получится.

В том же випросе, насколько я понял, для этого выделяется подмножество всех связей модели.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415650
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shr,

ну у вас куча противоречий и подозрений потому что вы упорно не хотите почитать то что я вам предлагал :)
Думаю что после прочтения развивающих статей у вас бы не осталось проблемных вопросов
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415717
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
во
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415721
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38415722
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38416194
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пара соображений, которыми хочу поделиться на базе опыта разработки и использования конфигуратора прикладных форм.

Надо иметь возможность биндить визуальные элементы (формы, панели, гриды) на сложные источники данных - запросы, табличные функции, процедуры. При этом можно встроить в источники данных разграничения по ролям. Такое разделение может, например, быть реализовано через динамическую склейку секции WHERE sql инструкции.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38416196
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ограничения доступа.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38416202
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При отображении сложных данных, имеющих определенную внутреннюю структуру, очень полезно использовать соответствующий контрол - тривью, аутлинер, т.п. Пример: очень многие системы хранят в каталоге организаций отношение парент-чаилд (дочерняя/зависимая фирма, холдинг и входящие в него компании и т.п.). Среди учетных систем финансового толка мне пока не попадались такие, где эта информация отображалась наглядно в виде дерева.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38416214
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самая типичная форма - табличного типа. Выглядеть она может очень по-разному: на ней могут быть расположена всевозможные контролы, управляющие представлением данных и собственно грид, в котором выводится массив данных.

Обязательно должен быть "мгновенный поиск". По мере набора текста в наборе данных должна позиционироваться запись, содержащая данный текст. Выглядит элементарно, но очень эффективно при поиске информации. Для этого же образца должна быть не менее мгновенная фильтрация набора.

Что касается фильтров. Формально, если в наборе есть поля из справочников, программистам очень просто сделать выбор по справочникам. Можно добавить пукт <Все> к перечислению из справочника. Но при практической работе фильты в понятиях бизнес-терминов обычно охватывают несколько полей, или вообще представляют собой сложные выражения для секции WHERE. Я считаю что такие и нужно иметь возможность конфигурировать для табличной формы. Как простейший частный случай перекрывают возможности простого фильтра - перечисления из справочника.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38416219
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример настройки фильтра

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT -2 as i, '<Все записи>' as s, -2 as i, '1=1' as c
UNION ALL SELECT -1 as i, 'Только базовые' as s, -1 as i, 'iUnitID_Base IS NULL' as c
UNION ALL 
SELECT iUnitID as i, 'Производные от ' + sUnitAlias as s, iUnitNomer as i, 'iUnitID_Base={LIST}' as c
FROM qrUnit
WHERE iUnitID_Base IS NULL
ORDER BY i



При выполнении этого кода получается набор данных для заполнения комбо (фильтра) на табличной форме:

IDВыводится в фильтреДля сортировкиУсловие WHERE-2 <Все записи> -2 1=1-1 Только базовые -1 iUnitID_Base IS NULL1 Производные от кг. (килограмм) 400 iUnitID_Base={LIST}2 Производные от м. (метр) 100 iUnitID_Base={LIST}3 Производные от м2 (метр квадратный) 200 iUnitID_Base={LIST}5 Производные от шт. (штук) 1 iUnitID_Base={LIST}9 Производные от м3 (метр кубический) 300 iUnitID_Base={LIST}

При выборе в фильтре условие WHERE добавляется к источнку данных формы. Для Только базовые получается:

Код: sql
1.
SELECT * FROM dbo.qrUnitEdit WHERE ((iUnitID_Base IS NULL)) ORDER BY iUnitNomer
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38416220
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще хотел бы рассказать о стандартных субформах, выполняющих типовые прикладные задачи, которые могут потребоваться в любой предметной области. Может быть завтра вечером сделаю еще несколько снимков экранов и постараюсь объяснить "на пальцах."
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38416225
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл написать, на форме настройки списка фильтрации видно, что для разных ролей можно задавать разные условия фильтрации. Это тоже бывает нужно при разделении доступа (раз наборы данных для разных ролей разные, то и условия отбора для них тоже могут потребоваться разные).
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38416227
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программист-Любитель,

ты эти СКЛ от руки что ли пишешь?
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38416228
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программист-ЛюбительЗабыл написать, на форме настройки списка фильтрации видно, что для разных ролей можно задавать разные условия фильтрации. Это тоже бывает нужно при разделении доступа (раз наборы данных для разных ролей разные, то и условия отбора для них тоже могут потребоваться разные).
и тут появляется задача и о раны значениях полей по умоляанию ля разных ролей, что нетривиально (сами фильтры то тривально генерятся и хранятся)
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38416229
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я же говорю: мой "конфигуратор" соединяет серверную скуэльную часть с клиентской аксесовской. Каждая делается в своей среде. Т.е. фильтры пишу и отлаживаю руками в студии.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38416231
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosПрограммист-ЛюбительЗабыл написать, на форме настройки списка фильтрации видно, что для разных ролей можно задавать разные условия фильтрации. Это тоже бывает нужно при разделении доступа (раз наборы данных для разных ролей разные, то и условия отбора для них тоже могут потребоваться разные).
и тут появляется задача и о раны значениях полей по умоляанию ля разных ролей, что нетривиально (сами фильтры то тривально генерятся и хранятся)
Я сумел нетривиально через механизм подстановки (типа как в препроцессоре) логику формирования условий накрутить.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38416232
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программист-Любитель,

фильтры то легко писать (хотя зачем их вручную, пользователь ведь не знает синаксис СКЛ)
а вот смарт лукап посложнее, когда список выбора (домен) значения поля вычисляется автоматически из семантики связей
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38416233
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программист-Любитель,

я ж говорю - условие ерунда, а вот по умочанию в соответствии с условием заполнять обусловленные поля - не так просто
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38416322
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря эта проблема была не самая горячая и, соответсвенно я ее и не решал. Точнее решал простым кодингом там, где это было необходимо (в каждой конкретной форме). Обычно заполнение "смарткомбо" идет рука об руку с общей кустомной логикой контроля ввода данных. Для важных и/но сложных объектов - договор, операция по договору, лимит и т.п. у меня были сделаны мастера (визарды) с постепенным заполнением данных в зависимости от уже введенного на предыдущих шагах.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38416566
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П-Л,

я понимаю, ты просто облегчаешь собственную жисть, нет цели сделать фреймворк полноценный
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38417499
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
смарт лукапы очень интересная весч
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38420125
bubuzu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не лучше будет как-нибудь xaml разметку динамически из той же бд подгружать? или целые EXEшники из бд тягать и запускать?
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38420221
Slalom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посмотрите в сторону Oracle APEX - очень грамотно все сделано. Можно много почерпнуть для своих поделок.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38420523
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программист-ЛюбительПри этом можно встроить в источники данных разграничения по ролям.У меня в клиенте sql нет вообще, все обращение через процедуры. Соответственно, если нужны будут разные where для разных ролей - буду в ХП либо писать if и возвращать разные курсоры, либо склеивать запрос динамически, либо использовать or в одном запросе - в зависимости от требований производительности.

Программист-ЛюбительПри отображении сложных данных, имеющих определенную внутреннюю структуру, очень полезно использовать соответствующий контрол - тривью, аутлинер, т.п. Пример: очень многие системы хранят в каталоге организаций отношение парент-чаилд (дочерняя/зависимая фирма, холдинг и входящие в него компании и т.п.). Среди учетных систем финансового толка мне пока не попадались такие, где эта информация отображалась наглядно в виде дерева.TcxTreeList - и колонки, и дерево.

Программист-ЛюбительОбязательно должен быть "мгновенный поиск". По мере набора текста в наборе данных должна позиционироваться запись, содержащая данный текст. Выглядит элементарно, но очень эффективно при поиске информации. Для этого же образца должна быть не менее мгновенная фильтрация набора.Это есть, прикладываю скрин. Поиск в отдельной строке - на самом деле фильтрация на клиенте, в лукап-комбо работает такая же (строится такое же выражение по отдельным словам). В самом гриде уже в каждой колонке есть инкрементальный поиск.

Программист-ЛюбительЧто касается фильтров. Формально, если в наборе есть поля из справочников, программистам очень просто сделать выбор по справочникам. Можно добавить пукт <Все> к перечислению из справочника. Но при практической работе фильты в понятиях бизнес-терминов обычно охватывают несколько полей, или вообще представляют собой сложные выражения для секции WHERE. Я считаю что такие и нужно иметь возможность конфигурировать для табличной формы. Как простейший частный случай перекрывают возможности простого фильтра - перечисления из справочника.Да, это интересный способ, приму на вооружение. Я обычно делал для такого отдельные параметры.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38420526
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SlalomПосмотрите в сторону Oracle APEX - очень грамотно все сделано. Можно много почерпнуть для своих поделок.Спасибо, посмотрю.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38420632
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShrДа, это интересный способ, приму на вооружение. Я обычно делал для такого отдельные параметры.У меня очень похожий визуальный построитель SQL WHERE условий, только используется он в "проверочных отчетах" - для контроля качества данных. К условиям для фильтров я себе такую штуку прикручивать не стал.
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38420643
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П-ЛУ меня очень похожий визуальный построитель SQL WHERE условий, только используется он в "проверочных отчетах" - для контроля качества данных. К условиям для фильтров я себе такую штуку прикручивать не стал.Нет, это работает в обратном направлении. Пользователь набирает в строке поиска куски слов, я (в коде) формирую простое условие, грид по нему фильтрует. То, что показано на скрине - редактор фильтра самого грида, пользователь обычно туда не лезет.

Еще думаю добавить кнопку для быстрого добавления условия фильтрации "текущее поле=текущему значению".
...
Рейтинг: 0 / 0
Набросал структуру для генерации GUI
    #38433852
Shr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще забавно, что клиенту в общем-то совсем без разницы, на сервере ли БД лежит логика или на сервере приложений. Ему достаточно получать данные для отображения и вызывать процедуры с параметрами. Т.е. в перспективе можно переложить логику в среднее звено, сделать клиента в браузере, или научить этого же клиента работать через tcp/ip (т.е. не только в интрасети) не с БД а с промежуточным сервером, который может выполнять процедуры хоть в БД хоть в AppServer.
...
Рейтинг: 0 / 0
63 сообщений из 63, показаны все 3 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Набросал структуру для генерации GUI
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]