Всем привет от самоучки любителя выносящего мозг десятилетиями )))))
И так друзья, кому не в лом, ответьте рекомендациями.
Много повидал подходов и реализаций. Где то свои пихнул )))
С годами менялось представление о тех или иных вещах....
Так вот, я все это к чему- прошу помощи!
Исходные данные:
1. Очень очень очень ленивый программист самоучка.
2. СУБД Postgre
3. Подобие софта работающего с СУБД пункта 2.
4. Не хочу классов в прямом понимании

))))))))))) как отдельных сущностей - только Query
5. Классы хочу, но лишь как базовые, для предоставления общих свойств и методов и возможно где то реалзизации интерфейсов, для дочерних (зебегая вперед, все вьюшки - фреймы и редакторы формы наследуемые, но это только для моей лени, что свойства и метода по сто раз одни и те же не мутить) -реализовано.
Забегая вперед, я да же MVVM реализовал на c#(wpf) но вот не лежит душа и все тут, порыпался порыпался, добился результатов и все... комп неделю не включал домашний )))) вернулся к Delphi.
И так в чем суть то в обще вопросов, а она в логике архитектуры, вот чего мне всегда реально не хватало, так это подобного опыта с нуля.
Что я решил.
1. DataModule , на него кидаю кучки Query (надоели мне все сложные запросы и всяческие FieldByName в последствии), ну допустим справочников. Это чисто плоские..точнее сами запросы плоские, типа Select поля from таблица.
-За чем? - Другие Query, без сложных запросов (если того не требуют, а просто связь отобразить) выполнят не сложный запрос к другим таблицам, а прилукапятся.
И тут первый вопрос, что быстрее, если таблица уже вскрыта в DataModule и сделается лукап нового Query по полю или запрос c присоединением Join, с точки зрения как нагрузки сети , так и (пусть это глупо прозвучит) отображения результата в виде грида клиенту?2. Вьюшка (не буду заморачивать, тут вопрос не в этом о ее концепции создания) - Frame, таких фреймов может быть много, как с ними совладать я разберусь... допустим он один, допустим это справочник пользователей, у пользователя есть роль, хочу увидеть эту роль по имени - делаю лукап поле (ко вскрытому ранее в datamodule справочнику)
3. Форма редактор, наследница там чего то, где есть ряд свойств и методов ,которые могу передать от вьюшки. Кинул DataSource на форму редактор (без Query), форма редактор на показ инициируется и копирует в Query (виртуальную, созданную в run-time - поле класса, и ее физической datasource (этой формы) присваиваю DataSet в виде этой Query)
-За чем? - Ленив, хочу сказать POST и все и это работает (надоели мне все сложные запросы и всяческие ParamByName в последствии), но только если есть либо точная копия с полями либо скопировать в рантайм )))Вопрос. Как скопировать поля из одной Query в другую без гемороя, включая Lookup?всякие там
...
query2.CopyFields(query1)
...
или
...
with query2.FieldDefs.Count-1
....
работает если лукапов нет
нагородил следующий огород, только не смейтесь, не украшал, пробовал разные варики, какой то заработал, кидаую ))))
+ |
procedure TModelEdt.AssignQuery(AQuerySource: TUniQuery; ADataSourceDest: TUniDataSource);
var i: Integer; fld: TField;
begin
self.QueryEdit := TUniQuery.Create(nil);
self.QueryEdit.Connection := AQuerySource.Connection;
self.QueryEdit.SQL.Text := AQuerySource.SQL.Text;
self.QueryEdit.AddWhere('id=' + AQuerySource.FieldByName('id').AsString);
for i := 0 to AQuerySource.Fields.Count - 1 do
begin
case AQuerySource.Fields[i].DataType of
ftString:
fld := TStringField.Create(Self);
ftInteger:
fld := TIntegerField.Create(Self);
end;
fld.Size := AQuerySource.Fields[i].Size;
if AQuerySource.Fields[i].FieldKind = fkLookup then
begin
fld.FieldKind := fkLookup;
fld.LookupResultField := AQuerySource.Fields[i].LookupResultField;
fld.KeyFields := AQuerySource.Fields[i].KeyFields;
fld.Lookup := true;
fld.LookupKeyFields := AQuerySource.Fields[i].LookupKeyFields;
fld.LookupDataSet := AQuerySource.Fields[i].LookupDataSet;
end;
fld.FieldName := AQuerySource.Fields[i].FieldName;
fld.DisplayLabel := AQuerySource.Fields[i].DisplayLabel;
fld.name := AQuerySource.Fields[i].name + 'Edt';
fld.DataSet := self.QueryEdit;
end;
self.QueryEdit.FieldDefs.UpDate;
ADataSourceDest.DataSet:= self.QueryEdit;
|
Может есть какой простой способ ?