Пример ядра для клиента БД - Часть 4 (Это шикарно!)

Опубликовано Dozent в ВС, 10/08/2014 - 08:34



Всем опять привет, хотелось бы продолжить.
Хорошо! Данные мы отобразили и даже можем отфильтровать их, но пока мы не можем подробно рассмотреть данные и изменить их или добавить.
Начну как ни странно с изменения данных:)
Я не делал кнопку "Открыть" чтобы не сильно парится с правами доступа и т.п. и приравнял открыть к изменить.
По нажатию кнопки "Изменить" открывается карточка с возможностью редактирования данных в ней...
Но прежде нам нужно знать какая же из десятков форм созданных от базовой карточки принадлежит данному списку. А чтобы наше ядро знало какую карточку открывать в событие списка onShow, добавляем:

protected
// Карточка принадлежащая списку
FCard: TfrmBaseCard;
...
procedure TfrmRankList.FormShow(Sender: TObject);
begin
inherited;
Fcard := frmRankCard;
end;

И как только откроется форма список задачи, ядро уже будет знать какая форма карточка принадлежит этой задаче.
Остаётся только открыть карточку по кнопке "Изменить"

procedure TfrmBaseList.btnEditClick(Sender: TObject);
begin
//мы проверяем есть ли в хотя бы одна запись в таблице и..
//А тут чуть чуть поподробнее. Открытие карточки не будет выполнятся если верхняя панель с кнопками будет не видна
//для чего это нужно?Иногда нужно открыть задачу в модальном окне и чтобы пользователь выбрал какуюнить запись, например при занесении сотрудника можно вызвать задачу //"Должности" и указать должность сотрудника, в модальном окне кнопки создать и тд не видны и там не должны открываться ни какие карточки
//и вот когда эти задачи вложены в карточку какойнить задачи,
if (Grid.DataSource.DataSet.RecordCount > Innocent and (TopPanel.Visible) then
begin
//Так же как у списка и карточке есть свойство отвечающее за ключевое поле
FCard.KeyField := KeyField;
//Разберу ниже
FCard.ID := GetSelectedID;
//показываем карточку
FCard.Show;
end;
end;

Что же такое FCard.ID := GetSelectedID; ? FCard.ID это свойство карточки, т.е. у каждой открытой карточки есть свой адишник, все ведь понимают что ключевое поле у таблиц это автоинкремент. Мы выбираем записьи и нажимаем открыть и запись открывается по адишнику той записи на которой сейчас находится указатель в датасете (на запись которую мы выбрали в таблице).
GetSelectedID это тоже свойство но обрабатывается оно процедурами

// Узнать ади выбраной записи
function GetSelectedID: Variant;
...
procedure SetSelectedID(const Value: Variant); virtual;
...
property SelectedID: Variant read GetSelectedID write SetSelectedID;
...
function TfrmBaseList.GetSelectedID: Variant;
begin
// получить id выбранной сущности
if mtRecords.Active then
//а вот и пригодилась всё таки переменная отвечающая за ключевое поле
Result := mtRecords.FieldValues[KeyField]
else
Result := Null;
end;
...
procedure TfrmBaseList.SetSelectedID(const Value: Variant);
begin
mtRecords.Locate(KeyField, Value, []);
end;

Каждый раз нажимать кнопку изменить думаю не очень удобно! Дабл Клик по таблице, это куда удобнее

procedure TfrmBaseList.GridDblClick(Sender: TObject); begin // если выбран элемент (таблица не пустая) if not VarIsNull(SelectedID) then // если видна панель для выбора то делаем выбора если не видна то открываем карточку {поясняю кроме кнопок создать, изменить и тд есть ещё кнопки "Выбрать" и "Отмена" они нужны для выбора данных} if SelectButon.Visible then // Если панель видна btnSelect.Click //то передаём результат выбора в форму из которой вызывали else btnEdit.Click; // Если есть кнопка "Изменить" тогда открываем карточку на изменение. end Кнопка "Создать", это тоже самое что и "Изменить", только мы не знаем адишки по которой будет открыватся картчока поэтому открываем карту по не существующей адишке -1. procedure TfrmBaseList.btnCreateClick(Sender: TObject); begin FCard.KeyField := KeyField; FCard.ID := -1; FCard.Show; end; Кнопка "Удалить", думаю тут просто достаточно кода и всё понятно procedure TfrmBaseList.btnDeleteClick(Sender: TObject); begin if Application.MessageBox(pchar('Удалить?'), pchar(Caption), MB_ICONEXCLAMATION + MB_YESNO + MB_TOPMOST) = ID_YES then begin qryRecords.Close; qryRecords.sql.Text := format('DELETE FROM %s WHERE %s = %s', //вот и таблица пригодилась и ключевое поле, так что эти параметры тоже необходимы [FUpdateTable, KeyField, GetSelectedID]); qryRecords.ExecSQL; Refresh; end; end;

Ещё у базовой формы список есть также возможно мультиселекта выбора, но её смысла описывать не вижу...

Хотелось бы подвести итогда по форме список...
Базовая форма список, знает:
- SQL запрос, по которому будут выбираться данные.
- Таблицу с которой работает задача
- Ключевое поле таблицы
- Форму карточку от задачи
Умеет:
-получать данные из базы
-определять ади выделеной записи
-открывать карточку

И всё это описывается только один раз и работающую форму список от задачи можно получить прибегнув к минимальному коду.
Например код формы список от задачи "Звания" выглядит так(это абсолютно весь код который есть в этом юните):

Спойлер
unit FRankList;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, FBaseList, DBGridEhGrouping,
ToolCtrlsEh, DBGridEhToolCtrls, MemTableDataEh, Data.DB, MemTableEh,
Data.Win.ADODB, GridsEh, DBAxisGridsEh, DBGridEh, Vcl.Buttons, Vcl.ExtCtrls;

type
TfrmRankList = class(TfrmBaseList)
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
protected
function GetFilter: string; override;
public
{ Public declarations }
end;

var
frmRankList: TfrmRankList;

implementation

{$R *.dfm}

uses FRankCard;

procedure TfrmRankList.FormCreate(Sender: TObject);
begin
inherited;
FSQL := 'SELECT rank_id, rank_name FROM Rank';
KeyField := 'rank_id';
FUpdateTable := 'Rank';
end;

procedure TfrmRankList.FormShow(Sender: TObject);
begin
inherited;
Fcard := frmRankCard;
end;

function TfrmRankList.GetFilter: string;
begin
Result := '1=1';
end;

end.

Клёва не правда ли?) После всех манипуляций, время на ввод формы списка для новой задачи в боевой режим занимал у меня не более 5 минут!!! Это шикарно:)

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

ВложениеРазмер
FBaseList.rar4.62 КБ