Форум: "Базы";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];
ВнизОкна редактирования записей таблиц(справочников) Найти похожие ветки
← →
StriderMan © (2007-07-31 11:07) [0]не знаю в тему или нет, перенесите если что
Т.к. таблиц двольно много, и как правило операции с ними одинаковые, сделали что-то типа справочников в 1С, т.е. есть некий базовый класс от датамодуля, он умеет выполнять типовые действия (редактирование, удаление, вставка и т.д.), в том числе показывать визуальные формы редактирования элемента и списка. В наследниках только определяются наборы данных и конкретные формы для редактирования (у которых тоже есть базовый класс) . Однако некоторые моменты еще требуют доработки.
Мастера, расскажите как у вас организовано редактирование элементов таблиц(справочников). Это просто формы или какая-то иерархия форм? А может автоматические построители форм? как со списками дела обстоят?
Как вообще организовано управление таблицами (удаление, вставка, редактирование): для каждой таблицы свой код или какие-то базовые классы есть?
или ткните что почитать на эту тему, плз.
← →
Sergey13 © (2007-07-31 11:21) [1]А что значит "управление таблицами"?
ИМХО все исключительно.
Есть универсальные инструменты для конкретных СУБД, типа ИБЭксперта. Разовые нештатные работы делаю в них.
Простых до безобразия справочников обычно не так много. Для них все равно рисую отдельные примитивные окошки - ибо фиг знает какую рюшечку запросит пользователь. Была идея нарисовать нечто универсальное - подумал и отпустило.
А для связанных таблиц, коих обычно большинство - сам бог велел рисовать оригинальные формы.
← →
SlymRO © (2007-07-31 11:21) [2]я делал так:
Обычная форма, все контролы привязаны к DataSource:object GridEdit: TGridEdit
object ToolBar1: TToolBar
object ToolButton1: TToolButton
Action = DataSetInsert1
end
object ToolButton2: TToolButton
Action = DataSetEdit1
end
object ToolButton3: TToolButton
Action = DataSetDelete1
end
end
object DBGridEh1: TDBGridEh
DataSource = DataSource
end
object ActionList1: TActionList
Images = ImageList
object DataSetInsert1: TDataSetInsert
Category = "Dataset"
Caption = Insert
DataSource = DataSource
end
object DataSetEdit1: TDataSetEdit
Category = "Dataset"
Caption = Edit
DataSource = DataSource
end
object DataSetDelete1: TDataSetDelete
Category = "Dataset"
Caption = Delete
DataSource = DataSource
end
end
object DataSource: TDataSource
OnStateChange = DataSourceStateChange
end
end
использую:procedure TDM.ShowDict(const TableName, Caption: string);
var
Table:TADOTable;
DS:TADODataSet;
i:integer;
GridEdit:TGridEdit;
begin
Table:=TADOTable.Create(nil);
try
Table.Connection:=Conn;
Table.TableName:=TableName;
Table.ReadOnly:=not DM.adm;
Table.Open;
DS:=TADODataSet.Create(nil);
try
Conn.OpenSchema(siColumns,EmptyParam,EmptyParam,DS);
with DS.FindField("DESCRIPTION") do
for i:=0 to Table.FieldCount-1 do
if DS.Locate("TABLE_NAME;COLUMN_NAME",VarArrayOf([TableName,Table.Fields[i].FieldNa me]),[]) then
Table.Fields[i].DisplayLabel:=AsString;
finally
DS.Free;
end;
GridEdit:=TGridEdit.Create(self);
try
GridEdit.Caption:=Caption;
GridEdit.DataSource.Dataset:=Table;
GridEdit.ShowModal;
finally
GridEdit.Free;
end;
finally
Table.Free;
end;
end;
← →
StriderMan © (2007-07-31 11:28) [3]
> Sergey13 © (31.07.07 11:21) [1]
> А что значит "управление таблицами"?
> типовые действия (редактирование, удаление, вставка и т.
> д.), в том числе показывать визуальные формы редактирования
> элемента и списка
> Есть универсальные инструменты для конкретных СУБД, типа
> ИБЭксперта. Разовые нештатные работы делаю в них
ну это само собой, тоже им пользуюсь. Нужно именно для штатной работы.
> Была идея нарисовать нечто универсальное - подумал и отпустило
а меня таки не отпустило :) кое-что удалось сделать. в базовой форме элемента правда только поле "наименование" и кнопки "ОК", "Отмена", зато 90% логики в коде :)
> SlymRO
это для списка. а для элемента? для каждой таблички своя уникальная?
← →
SlymRO © (2007-07-31 11:29) [4]переделать в окно выбора из справочника не проблема:
ID:=Table.Locate(IDFieldName,ID,[]);
result:=GridEdit.ShowModal;
ID:=Table[IDFieldName].Value;
юзадж:if ShowDict("Папы","Выбираем папу :)","IDFieldName",PapaID) then
DoSexWith(PapaID);
← →
StriderMan © (2007-07-31 11:35) [5]
> SlymRO © (31.07.07 11:29) [4]
> переделать в окно выбора из справочника не проблема:
не, я имею ввиду форму элемента. типа_Х
Имя: [ ]
Возраст: [ ]
Пол [ ]
[ОК] [отмена]
← →
SlymRO © (2007-07-31 11:41) [6]StriderMan © (31.07.07 11:28) [3]
придется динамически контролы клепать... но ето не проблема: бежим по полям и делаем контролы нужного типа...
или форма с контейнером (фрейм например) и динамически загружать в него содержимое из базы. недостаток: придется для каждого обекта в дизайнере таки ручками прототип делать...
но если скрестить оба метода должно ниплохо получиться
← →
SlymRO © (2007-07-31 11:45) [7]http://www.delphimaster.ru/articles/bdform/index.html
← →
StriderMan © (2007-07-31 11:52) [8]
> SlymRO © (31.07.07 11:41) [6]
> придется динамически контролы клепать...
я немного другим путем пошел - базовый класс формы (TCustomEditForm) с кнопкми ОК и ОТМЕНА и с логикой в коде. а в наследниках добрасываю контролов на форму и прописываю связи с полями и все.
Базовый класс датамодуля имеет абстрактный метод типаfunction GetEditForm: TCustomEditForm; virtual; abstract;
а наследники-датамодули уже возвращают неабстрактные формы в этом методе
← →
SlymRO © (2007-07-31 12:02) [9]конечно крут :) но если будет 100 сущностей? будет и 100 датамодулей и 100 TEditFormов?
а если проект динамичный, и множество разработчиков? тады задолбаетесь новые формочки клепать...
можно канечно на пакеты разбить: в пакетах формы для сущьностей...
в пакете RegisterEditor("PapaEdit",TPapaEdit)
CreateEditor(const EditName)
if FindEditor(EditName,Editor) then
return Editor
else return DefaultEditor;
и один DefaultEditForm с динамическим клепанием контролов для заглушки
← →
StriderMan © (2007-07-31 12:35) [10]
> но если будет 100 сущностей? будет и 100
> датамодулей и 100 TEditFormов?
> а если проект динамичный, и множество разработчиков? тады
> задолбаетесь новые формочки клепать...
именно так сейчас дела и обстоят :)))
> можно канечно на пакеты разбить:
до этого пока не дожили :)
← →
Petr V. Abramov © (2007-08-02 12:22) [11]> StriderMan © (31.07.07 11:52) [8]
тоже самое
← →
StriderMan © (2007-08-02 13:13) [12]
> Petr V. Abramov © (02.08.07 12:22) [11]
это вселяет оптимизм :))
есть даже некоторое желание оформить все это в виде готовых компонентов, пусть народ пользуется :)
типа "подключи БД за 5 минут" :))
← →
Jeer © (2007-08-02 14:42) [13]
> есть даже некоторое желание оформить все это в виде готовых
> компонентов
?
Для этого есть репозиторий.
Пример такой формы:
http://slil.ru/24694370
← →
StriderMan © (2007-08-02 16:52) [14]
> Jeer © (02.08.07 14:42) [13]
> Для этого есть репозиторий.
та я ж не для себя хочу. у меня тоже в репозитории есть.
Сделать компоненты, выложить на torry.
← →
Игорь Шевченко © (2007-08-02 18:44) [15]как делаю я -
есть Template для формы редактирования с кнопками Ok и Cancel и с методами DisplayObject и FillObject
есть Template для формы списка, натурально с гридом по вкусу, DataSource и с Actions Add, Update, Delete, Aggregate, Filter, Print, Excel.
Эта форма может вызываться как модальная и как не модальная. В первом случае еще две кнопки Ok и Cancel.
есть Template для датамодуля, реализующего два интерфейса - один для получения DataSet для того самого списка, а второй для загрузки объекта по ключевым полям и сохранения объекта (с указанием новый или существующий).
И есть объекты, собственно предметной области.
Все формы работают с методами интерфейсов, не зная, кто их реализует, все формы редактирования работают с объектами, а не с полями в записях.
Вот так.
← →
Игорь Шевченко © (2007-08-02 18:46) [16]
> но если будет 100 сущностей? будет и 100 датамодулей и 100
> TEditFormов?
На этот случай написан генератор кода, который по описанию сущности генерирует заготовки для всех вышеуказанных форм, датамодулей, объектов и интерфейсов. В случае простых объектов, тех же справочников, результат работы генератора можно включать сразу в проект, в случае сложных объектов, с коллекциями внутри, приходится дорабатывать сгенерированный код вручную.
← →
Gadenysh (2007-08-02 19:44) [17]
> Игорь Шевченко © (02.08.07 18:44) [15]
прям мануал к моей системе)
и генератор тоже есть))
← →
Игорь Шевченко © (2007-08-03 10:05) [18]Gadenysh (02.08.07 19:44) [17]
> прям мануал к моей системе)
> и генератор тоже есть))
У дураков мысли сходятся ? :)
Или одного и того же Фаулера читали ?
← →
StriderMan © (2007-08-03 11:30) [19]
> Игорь Шевченко © (02.08.07 18:44) [15]
Как все похоже :) кстати тоже интерфейсы использую.
> На этот случай написан генератор кода
вот этого еще нет
> У дураков мысли сходятся ? :)
> Или одного и того же Фаулера читали ?
Видимо первое :) Фаулера не читал.
← →
clickmaker © (2007-08-03 11:41) [20]
> Мастера, расскажите как у вас организовано редактирование
> элементов таблиц(справочников).
несколько таблиц-справочников. Русские заголовки таблиц и полей добавляются через sp_addextendedproperty "MS_Description", читаются через
sp_getextendedproperty.
Одна универсальная форма с гридом и кнопками + 1 query + UpdateSQL, скрипты для которого составляются динамически по списку полей.
← →
StriderMan © (2007-08-03 12:00) [21]
> Одна универсальная форма с гридом и кнопками
это форма списка. а форма элемента? или их нет?
> Русские заголовки таблиц и полей добавляются через sp_addextendedproperty
> "MS_Description", читаются через
> sp_getextendedproperty
недопонял. где эти названия хранятся реально? Это встроенная фича MSSQL?
← →
clickmaker © (2007-08-03 12:02) [22]
> это форма списка. а форма элемента? или их нет?
ну для тех справочников, которые я делал, прямо в гриде редактирование
> где эти названия хранятся реально? Это встроенная фича MSSQL?
да. Description можно задать и при визуальном проектировании таблицы
← →
StriderMan © (2007-08-03 12:10) [23]
> да. Description можно задать и при визуальном проектировании таблицы
В FB похоже тоже есть. По крайней мере из системной таблицы можно вытащить RDB$RELATIONS.RDB$DESCRIPTION
← →
clickmaker © (2007-08-03 14:30) [24]
> а форма элемента?
кстати, делал и такую. Динамическое создание полей ввода соответственно типам полей. Строка - Edit, Дата - DTPicker, Bool - флажок и т.д. Все на скроллбоксе на всякий случай.
Делал также вариант, когда имя-значение отображались в одном списке в виде гиперссылок. При щелчке открывался маленький диалог с соотв. полем ввода.
← →
MsGuns © (2007-08-06 09:48) [25]Универсализация интерфейса работы со всем многообразием "справочников" средствами чисто Делфи суть опасная блажь, со временем аукнется большими проблемами
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.041 c