Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
15-1194968623
IOrist
2007-11-13 18:43
2007.12.09
Почиму в орешнике 1 страница?


3-1185800370
HID
2007-07-30 16:59
2007.12.09
Проблема с очисткой таблицы


11-1180896008
=BuckLr=
2007-06-03 22:40
2007.12.09
Защита участка RichEdit от изменения


2-1194901296
Vice____
2007-11-13 00:01
2007.12.09
TEdit>мой компонент


2-1195132279
outlaw
2007-11-15 16:11
2007.12.09
Форматный вывод в StringGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский