Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.09;
Скачать: CL | DM;

Вниз

Окна редактирования записей таблиц(справочников)   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.026 c
15-1194942281
Kerk
2007-11-13 11:24
2007.12.09
На Украине закрыли Блоггер.ком?


15-1194694215
Evanescence
2007-11-10 14:30
2007.12.09
Как составить техническое задание


15-1193942969
Kerk
2007-11-01 21:49
2007.12.09
MMP может?


2-1195214711
timekiller
2007-11-16 15:05
2007.12.09
Проверка на повторы по нодам


15-1194708068
Kostafey
2007-11-10 18:21
2007.12.09
Современный научный язык программирования