вторник, 27 декабря 2011 г.

Урок 27. Отображение записей в Grid главной формы


В предыдущем уроке я показал как можно подготовить базу данных к работе, т.е. удалить из таблиц всю хранимую в них информацию, которая к определенному этапу становится не актуальной. В дальнейшем мы еще внесем некоторые изменения в алгоритм очистки, поскольку начинать каждый отчетный период (год) с "чистого листа", наверное, не совсем интересно и даже не правильно. Позже, когда речь пойдет об оборотной ведомости, я покажу, как можно подсчитать остатки, и тогда в алгоритм очистки базы данных нужно будет добавить несложный механизм, позволяющий перенести конечные остатки по счетам в начальные. Но, об этом чуть позже.
Давайте займемся главной формой проекта (MainFrm): пора уже научить ее отображать учетные записи.
Для этого расположите на форме два компонента:
TADOTable и TDataSource с вкладок dbGo и DataAccess соответственно.
Для начала, дайте компонентам имена: ADOTableMain и DataSourceMain.
Затем, для таблицы установите свойства:
Connection = ADOConnection1;
TableName=Main;
Щелкните дважды по компоненту ADOTableMain, и в появившемся окне с помощью правой кнопки добавьте все поля (Add all fields...).
Назначьте источник данных компоненту DataSourceMain:
DataSet = ADOTableMain;
Позаботьтесь о сортировке записей. Будет удобнее, если записи будут отображаться в порядке убывания даты, т.е. более свежие всегда вверху. Для этого в свойстве IndexFieldNames компонента ADOTableMain укажите поле сортировки MyDate с постфиксом DESC.
И последнее, что осталось сделать - указать для сетки (Grid), расположенной на форме источник отображаемых данных:
DataSource = DataSourceMain;
Если сейчас запустить проект, то после выбора МО, отобразится... опять таки пустая таблица... В чем же дело?
Очень просто: таблица Main не активна.
Разыщите процедуру:
procedure TMainFrm.TableActive(p: boolean);
begin
// Активация (деактивация таблиц)
ADOTableMOs.Active:=p;
end;
и добавьте в нее строчку кода:
ADOTableMain.Active:=p;
Аналогичные действия выполняйте при добавлении в проект новой таблицы.
Теперь, если Вы запустите проект, то увидите таблицу (я заранее внес в нее несколько записей для наглядности, ведь, с помощью механизма очистки нам теперь ничего не стоит их удалить!), но зрелище это будет мало утешительным:





Плохо - все:
1. Нужно ли пользователю видеть служебное поле счетчика? Нет.
2. Учет в нашей стране ведется в рублях и копейках, а Summa отображает как будто бы целые.
3. Мы, вроде бы, выбрали мемориальный ордер, а здесь - все записи внавал... (МО=12 и МО=13 и т.д.).
4. Если МО уже выбран, зачем вообще отображать это поле, если значение в нем всегда будет одно и тоже, пока мы не выберем другой МО?
5. Что за чуднЫе заголовки у полей?
6. Хотелось бы, чтобы поля признаков Дебета и Кредита (D и K) отображали бы удобочитаемую информацию, а не порядковые номера счетов, которые пользователь помнить не обязан.
7. Скрытый недостаток - попробуйте ввести что-то в любое поле. Скорее всего, это у Вас получится. Но, задача этой сетки - просмотр записей, а не их редактирование.
8. Хорошо бы по сумме иметь итог.
Именно поэтому я и перечеркнул вид главной формы на иллюстрации. Такой вид никуда не годится.
Давайте постепенно разбираться и исправлять.
Для начала вызовите редактор колонок сетки (дважды щелкнув на DBGridEh1). Нажмите в нем пиктограмму Add all Fields (добавить все поля).
Для полей ID и MO, отображать которые нет необходимости, установите свойство Visible в False.
Остальным полям назначьте заголовки в свойствах Title.Caption ( я записал здесь свойство через точку, это означает, что Title имеет раскрывающийся список свойств, одно из которых Caption), как показано на рисунке:



Недостатки под номерами 1, 4 и 5 устранены.
Побороть пункт 2 можно с помощью свойства DisplayFormat для колонки Summa компонента DBGridEh1, задав в нем следующее значение: "0.,00".
Для решения вопроса отображения записей только одного мемориального ордера, добавьте в процедуру ShowMOs() несколько операторов после комментария "Смена фильтра в главной форме":
procedure TMainFrm.ShowMOs();
Begin
Application.CreateForm(TMOs_Frm, MOs_Frm);  MOs_Frm.ShowMoDal;  MOs_Frm.Free;
// Смена фильтра в главной форме
ADOTableMain.Filtered:=False;
OldFilter:='MO=' + IntToStr(MySelect.MySel_IDMO);
ADOTableMain.Filter:=OldFilter;
ADOTableMain.Filtered:=True;
StatusBarUpdate;
end;
После всех этих манипуляций, главная форма уже лучше показывает записи из базы данных, но все же еще...



Для красоты и удобства (а также для возможности некоторого контроля и анализа в будущем),  необходимо организовать самосчетный подвал (футер) в Grid-е. Для этого в свойствах компонента DBGridEh1 укажите
FooterRowCount = 1;
дословно: количество строк в "подвале" - одна и
SumList.Active = True;
Затем, выберите в редакторе колонок поле Summa и укажите следующие его свойства:
Footer.DisplayFormat=0.,00;
Footer.FieldName=Summa;
Footer.ValueType=fvtSum;
Вот, уже форма приближается к нормальному виду:



Чтобы решить вопрос с отображением счетов, необходимо добавить на форму еще пару компонентов TADOTable и TDataSource, связав их, как мы уже это делали выше, с таблицей счетов (Accounts). Назовем их ADOTableAcc и DataSourceAcc соответственно.
Не забудьте добавить ADOTableAcc.Active:=p; в процедуру активации таблиц.
Вызовите конструктор полей для таблицы ADOTableMain.
По правой кнопке вызовите контекстное меню, а нем выберите New Field... (Новое поле). Заполните свойства нового поля, как показано на иллюстрации:



Таким образом Вы создадите так называемое  поле Lookup или поле с подстановкой.
Теперь нужно отобразить его в гриде.
Щелкните дважды по сетке, чтобы вызвать конструктор колонок. Воспользуйтесь еще раз кнопкой "Добавить все поля", но ВНИМАНИЕ: на вопрос "перезаписать?" ответьте отрицательно.
Затем удалите из списка повторно добавленные поля и поле "D". Перетащите на его место новое поле "D_Name". Подправьте его свойство:
Caption=Дебет;



Соответственно форма будет выглядеть совсем уже почти...



Надеюсь, что я очень подробно все описал, и Вы самостоятельно сделаете поле с подстановкой "Кредит".
Последний недостаток устраните, установив свойство DBGridEh1.Options.dgEditing = False.
В качестве бонуса конечному пользователю:
установите в свойствах DBGridEh1
OptionsEh.dghRowHighLight=True - удобно, когда строки в таблице подсвечиваются и
Options.dgAlwaysShowSelection=True - для подсветки выделенной курсором ячейки.
На этом сегодня все.
В следующем уроке я покажу как организовать ввод и редактирование данных в главной таблице.

Комментариев нет:

Отправить комментарий