Имя модуля
|
Назначение
|
UConnect
|
Осуществление идентификации
|
UMain
|
Хранит алгоритм работы с кнопками, алгоритм построения
макета отчета, проверки соединения с БД
|
uDM
|
Хранит алгоритм соединения с БД
|
UDogovor
|
Хранит алгоритм редактирования просмотра списка договоров
|
uEdDogovor
|
Хранит алгоритм редактирования данных, добавления новых
|
UFackult
|
Хранит алгоритм редактирования справочника факультетов и
добавления в него новых записей
|
UGroup
|
Хранит алгоритм редактирования справочника групп и
добавления в него новых записей
|
UStudent
|
Хранит алгоритм редактирования справочника студентов и
добавления в него новых записей
|
Хранит алгоритм указания параметров формирования отчета
|
Urpt
|
Хранит алгоритм построения макета отчета
|
Ulib
|
Хранит алгоритм сохранения данных в НД
|
3. Описание
алгоритма формирования отчета
Алгоритм формирования отчета имеет следующий вид:
. Вывод окна для задания параметров отчета. Если не нажата кнопка
«Вывести» - выход из процедуры.
. При первом формировании отчета создание запроса, при последующих
формированиях ее очистка.
. Проверка данных на наличие, если они есть-продолжаем, если нет,
выводим сообщение.
. Заполняем заголовок отчета.
. Выводим отчет в режиме Priview.
. Закрываем НД.
Блок-схема процедуры формирования отчета представлена на рисунке 3.
Объяснение процедуры формирования отчета представлено в разделе 7, в
исходном тексте модуля uMain.
Рис. 3. Блок-схема процедуры формирования отчета
4.
Руководство программиста
Для установки программы необходимо разместить исполняемый файл Proj_Oplata_Obuch.exe данных в папке C:\Program Files\ Proj_Oplata_Obuch
Файлы базы данных необходимо разместить в каталоге C:\Program Files\ Proj_Oplata_Obuch После этого необходимо в программе ODBC Administrator добавить источник данных
пользователя для обращения к базе данных. Источник должен иметь имя Oplata_obuchenia и в поле Database file на вкладке Database должен быть указан путь размещения файлов базы данных (C:\Program Files\ Proj_Oplata_Obuch \db).
Ярлык приложения необходимо разместить в удобном для пользователя месте
(например на рабочем столе), в качестве объекта указать путь к исполняемому
файлу (C:\Program Files\ Proj_Oplata_Obuch \ Proj_Oplata_Obuch.exe),
именем ярлыка установить «Учет оплаты обучения».
. Руководство
пользователя
Запуск программы осуществляется с рабочего стола, путем двойного клика по
ярылку с именем «Учет оплаты обучения». После запуска программы открывается
меню. Вид меню представлен на рисунке 4.
Рис. 4. Вид меню программы
Форма меню имеет следующие элементы: сгруппированные кнопки для выбора
справочников, кнопка основная и кнопка для вывода отчета, заголовок и картинка.
При нажатии на кнопку “Договор”открывается форма для ее просмотра с
кнопками для открытия формы дальнейшего редактирования или добавления данных, с
навигатором о списку и кнопкой обновления.. Вид формы представлен на рис. 5
Рис. 5. Форма просмотра списка договоров.
Основная форма имеет два основных элемента: элемент отображения данных с
навигацией и панель управления данными. Элемент отображения данных служит для
отображения данных о договорах, а также для навигации в пределах набора данных.
Для добавления или редактирования записи, необходимо кликнуть по кнопке с
соответствующим рисунком. При добавлении новой записи, а также редактировании,
необходимо чтобы все поля были заполнены. Навигатор позволяет перемещаться по
списку, а также удалять данные.Для обновления данных следует нажать на кнопку
обновления . Пример добавления данных представлен на рисунке 6.
Рис. 6. Форма добавления данных
После заполнения всех полей верхней панели, кроме поля «Оплачено» и
«Общая стоимость», необходимо кликнуть по кнопке «Сохранить». Затем на нижней
левой панели нажать на кнопку навигатора со значком «+» и заполнить поля. После
этого нажать на кнопку навигатора с изображением галочки для сохранения
изменений. То же самое проделать и для заполнения второй таблицы. Нажать на
кнопку «Выход» для закрытия формы добавления.
Для открытия справочников, на основной форме необходимо выбрать нужный
справочник и нажать на соответствующую кнопку. Внешний вид формы справочника
«Факультеты» представлен на рисунке 7.
Рис. 7. Вид формы «Факультеты»
На форме представлены данные таблицы, которые можно редактировать,
добавлять новые, удалять. Также есть кнопка обновления данных .
Для формирования отчета (оборотной ведомости) о задолженностях по оплате,
необходимо на основной форме кликнуть по кнопке «Отчет». На экране появится
форма для ввода параметров отчета. Форма приведена на рисунке 8.
Рисунок 8 - Форма «Параметры отчета»
В форме указывается Дата и курс, по которым будет сформирован отчет.Для
указания даты используется календарь, а курс можно выбрать из выпадающего
списка. При нажатии кнопки «Вывести» будет сформирован отчет, при нажатии
кнопки «Отмена» или закрытии формы отчет выводиться не будет. Пример
формирования отчета приведен в разделе 6.
6. Описание
контрольного примера
Для демонстрации работы программы таблицы были заполнены данными
контрольного примера. Содержание таблиц базы данных приведены на рисунках 9-12.
Рис. 9. Пример заполнения данными формы
Рис.10. Содержание таблицы Group
Рис.11. Содержание таблицы Student
Рис.12. Содержание таблицы Fackultet
При формировании отчета в качестве параметров программа запрашивает дату
и курс обучающегося.Пример заполнения представлен на рисунке 13.
Рис. 13. Форма задания параметров отчета
Результат вывода отчета представлен на рисунке 14.
Рис.14 Вывод отчета по контрольному примеру
7.
Текст программы
UMain;, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,,DB, Grids, DBGrids, StdCtrls, Buttons, ExtCtrls, jpeg;=
class(TForm): TPanel;: TGroupBox;: TBitBtn;: TLabel;: TBitBtn;: TBitBtn;:
TBitBtn;: TImage;: TBitBtn;FormShow(Sender: TObject);BitBtnDogovClick(Sender:
TObject);BitBtnFackultClick(Sender: TObject);BitBtnGruppaClick(Sender:
TObject);BitBtnStudentClick(Sender: TObject);BBReportClick(Sender: TObject);
{ Private declarations }
{ Public declarations };: TFrmMain;uDM, UDogovor, UFackult,
UGroup, UStudent,Ulib, UParamRpt, Urpt;
{$R *.dfm}TFrmMain.FormShow(Sender: TObject);:integer;
//DM.DB.Connected:=true;:=1;
while(not DM.DB.Connected)and
(i<=3) and f_con do
begin.DB.Connected:=true;E:EDataBaseError dof_con then('Соединение с БД не удалось',mtError,[mbOk],0);
end;(i);;not DM.DB.Connected
then.Terminate;;;TFrmMain.BitBtnDogovClick(Sender:
TObject);.Show;;TFrmMain.BitBtnFackultClick(Sender:
TObject);.Show;;TFrmMain.BitBtnGruppaClick(Sender: TObject);.Show;;TFrmMain.BitBtnStudentClick(Sender:
TObject);.Show;;TFrmMain.BBReportClick(Sender: TObject);
if not (frmParamRpt.ShowModal=mrOk) then;
try
// Для формирования отчета используем набор данных DM.qSql
with DM.qSql do begin.clear;
// Запрос выполнения процедуры БД формирования отчета
sql.add('call Procedura1(:fdat,:tip)');
// Параметры процедуры,берутся из формы параметров отчета
ParamByName('fdat').AsDate:=
frmParamRpt.edDatFirst.Date;('tip').AsString:= frmParamRpt.CB_Kurs.Text;
Open;
except
// Проверка наличия
данныхDM.qSql.isEmpty then begin('Нет данных для отчета');
Exit;
end;
// Заполнение заголовка отчета заданными параметрами
frmRpt.QRLBData.caption:='на
'+(frmParamRpt.edDatFirst.Date);.QRLBKurs.caption:='Курс '+.CB_Kurs.Text;
// Вывод отчета в режиме предпросмотра
frmRpt.Preview;
finally
// Закрытие набора данных
DM.qSQL.closeUGroup;, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,, Grids, DBGrids, DBCtrls, Buttons, ExtCtrls;=
class(TForm): TPanel;: TPanel;: TSpeedButton;: TDBNavigator;: TPanel;:
TDBGrid;SBRefreshClick(Sender: TObject);FormShow(Sender: TObject);
{ Private declarations }
{ Public declarations };: TFrmGroup;uDM;
{$R *.dfm}TFrmGroup.SBRefreshClick(Sender:
TObject);_kod:string;_kod:=DM.QGruppa.FieldByName('Kod_gr').AsString;DM.QGruppa
do begin;;;:='Kod_gr='+s_kod;;;;;TFrmGroup.FormShow(Sender: TObject);not
DM.QGruppa.Active then
DM.QGruppa.Open;
except
ShowMessage ('Ошибка при открытии справочника "Договор"' ');
end;UStudent;, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,, Grids, DBGrids, DBCtrls, Buttons, ExtCtrls;=
class(TForm): TPanel;: TPanel;: TSpeedButton;: TDBNavigator;: TPanel;:
TDBGrid;SBRefreshClick(Sender: TObject);FormShow(Sender: TObject);
{ Private declarations }
{ Public declarations };: TFrmStudent;uDM;
{$R *.dfm}TFrmStudent.SBRefreshClick(Sender:
TObject);_kod:string;_kod:=DM.QStudent.FieldByName('Kod_stud').AsString;DM.QStudent
do begin;;;:='Kod_stud='''+s_kod+'''';;;;;TFrmStudent.FormShow(Sender:
TObject);not DM.QStudent.Active then.QStudent.Open;('Ошибка при открытии справочника "Договор"');;; end.UFackult;,
Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, Grids,
DBGrids, DBCtrls, Buttons, ExtCtrls;= class(TForm): TPanel;: TPanel;:
TSpeedButton;: TDBNavigator;: TPanel;: TDBGrid;SBRefreshClick(Sender:
TObject);FormShow(Sender: TObject);
{ Private declarations }
{ Public declarations };: TFrmFackult;uDM;
{$R *.dfm}TFrmFackult.SBRefreshClick(Sender:
TObject);_kod:string;_kod:=DM.QFackultet.FieldByName('krat_naim_fackult').AsString;DM.QFackultet
do begin;;;:='krat_naim_fackult='''+s_kod+'''';;;;TFrmFackult.FormShow(Sender:
TObject);not DM.QFackultet.Active then.QFackultet.Open;('Ошибка при открытии справочника "Договор"');.
UDogovor;, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,, Grids, DBGrids, ExtCtrls, Buttons, DBCtrls;= class(TForm):
TPanel;: TPanel;: TDBGrid;: TDBNavigator;: TSpeedButton;_Ins:
TSpeedButton;_Edit: TSpeedButton;SBRefreshClick(Sender: TObject);FormShow(Sender:
TObject);SB_InsClick(Sender: TObject);SB_EditClick(Sender: TObject);
{ Private declarations }
{ Public declarations };: TFrmDogovor;_kod:string;uDM,
uEdDogovor, ulib;
{$R *.dfm}TFrmDogovor.SBRefreshClick(Sender:
TObject);.DogovorRefresh;;
TFrmDogovor.FormShow(Sender: TObject);not DM.QDogovor.Active
then.QDogovor.Open;
except
ShowMessage ('Ошибка при открытии справочника "Договор"');
end;;TFrmDogovor.SB_InsClick(Sender:
TObject);.QDogovor.Insert;TFrmedDogovor.Create(Application) do;;;;.DogovorRefresh;;TFrmDogovor.SB_EditClick(Sender:
TObject);.QDogovor.Edit;TFrmedDogovor.Create(Application)
do;;;;.DogovorRefresh;;
UConnect;, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,, StdCtrls, ExtCtrls;= class(TForm): TPanel;: TLabel;: TLabel;:
TEdit;: TEdit;: TButton;: TButton;
{ Private declarations }
{ Public declarations };: TFrmConnect;
{$R *.dfm}.uDM;, Classes, DB, DBTables,Forms,Controls,
Dialogs, Messages,, Variants;= class(TDataModule): TDatabase;: TQuery;:
TQuery;: TQuery;: TQuery;: TQuery;: TQuery;_dogov: TIntegerField;_dogov:
TIntegerField;_dogov: TDateField;_stoim: TFloatField;: TFloatField;_stud:
TStringField;_gr: TStringField;_stoim: TIntegerField;_obuch: TSmallintField;:
TFloatField;_dogov: TIntegerField;_gr: TStringField;_naim_fackult:
TStringField;_l: TStringField;_opl: TIntegerField;_opl: TDateField;_kvitanc:
TIntegerField;_obuch: TSmallintField;_opl: TFloatField;: TStringField;_dogov:
TIntegerField;_l: TStringField;_l: TStringField;_Calcul: TFloatField;_stud: TStringField;:
TStringField;: TStringField;: TStringField;_opl: TFloatField;: TDataSource;:
TDataSource;: TDataSource;: TDataSource;: TDataSource;:
TDataSource;_naim_fackult: TStringField;_naim_fackult: TStringField;:
TQuery;DBLogin(Database: TDatabase; LoginParams:
TStrings);QDogovorCalcFields(DataSet:
TDataSet);QStoimostStoimostValidate(Sender:
TField);QFackultetAfterPost(DataSet: TDataSet);QGruppaAfterPost(DataSet:
TDataSet);QStudentAfterPost(DataSet: TDataSet);QDogovorAfterPost(DataSet:
TDataSet);QDogovorBeforeDelete(DataSet: TDataSet);QDogovorBeforeEdit(DataSet:
TDataSet);QDogovorBeforeInsert(DataSet:
TDataSet);qrChange(Sender:TField);QDogovorAfterOpen(DataSet:
TDataSet);QDogovorBeforePost(DataSet:
TDataSet);DogovorRefresh;QOplataBeforePost(DataSet: TDataSet);QOplataBeforeDelete(DataSet:
TDataSet);QOplataBeforeEdit(DataSet: TDataSet);QOplataAfterPost(DataSet:
TDataSet);QStoimostAfterPost(DataSet: TDataSet);QStoimostBeforeDelete(DataSet:
TDataSet);QStoimostBeforeEdit(DataSet: TDataSet);QStoimostBeforePost(DataSet:
TDataSet);QOplataAfterOpen(DataSet: TDataSet);QStoimostAfterOpen(DataSet:
TDataSet);AppException(Sender:TObject;E:Exception);
{ Private declarations }
public
{ Public declarations };_kod: string;:
TDM;_con:boolean=true;UConnect, uMain, Ulib;
{$R *.dfm}TDM.DBLogin(Database: TDatabase; LoginParams:
TStrings);_con:=true;:=TFrmConnect.Create(application);FrmConnect.ShowModal =
mrOk then begin.Values['USER
NAME']:=FrmConnect.EdUser.Text;.Values['PASSWORD']:=
FrmConnect.EdPsw.Text;else_con:=false;.Free;;not f_con then
abort;TDM.QDogovorCalcFields(DataSet: TDataSet);
{DataSet.FieldByName('Oplacheno').AsFloat:=
((DataSet.FieldByName('Procent_opl').AsFloat) *
(DataSet.FieldByName('Obsch_stoim').AsFloat))/100
};TDM.QStoimostStoimostValidate(Sender: TField);Sender.Value < 0 then begin('Стоимость не может быть
отрицательной!');
Sender.Value:= Null;;;TDM.QFackultetAfterPost(DataSet:
TDataSet);s_kod:string;_kod:=DM.QFackultet.FieldByName('krat_naim_fackult').AsString;DM.QFackultet
do begin;;
Open;:='krat_naim_fackult='''+s_kod+'''';
FindFirst;;;;TDM.QGruppaAfterPost(DataSet:
TDataSet);_kod:string;_kod:=DM.QGruppa.FieldByName('Kod_gr').AsString;DM.QGruppa
do begin;;;:='Kod_gr='+s_kod;;;;TDM.QStudentAfterPost(DataSet:
TDataSet);_kod:string;_kod:=DM.QStudent.FieldByName('Kod_stud').AsString;DM.QStudent
do begin;;;:='Kod_stud='''+s_kod+'''';;;;TDM.QDogovorAfterPost(DataSet:
TDataSet);_kod:string;_kod:=DM.QDogovor.FieldByName('Id_dogov').AsString;DM.QDogovor
do begin;;;:='Id_dogov='+s_kod;;;;TDM.QDogovorBeforeDelete(DataSet:
TDataSet);not CreateDeleteSql('Dogovor',
'Id_dogov',.FieldByName('Id_dogov').AsString)then;;TDM.QDogovorBeforeEdit(DataSet:
TDataSet);(DataSet);_kod:=
DataSet.FieldByName('Id_dogov').AsString;;TDM.QDogovorBeforeInsert(DataSet:
TDataSet);(DataSet);_kod:= '-1';;TDM.qrChange(Sender:
TField);.Tag:=1;;TDM.QDogovorAfterOpen(DataSet: TDataSet);:word;i:=0 to
DataSet.FieldCount-1 do beginnot (DataSet.Fields[i].Lookup or
DataSet.Fields[i].Calculated)
then.Fields[i].OnChange:=qrChange;UpperCase(DataSet.Fields[i].FieldName)=
'DATE_DOGOV'
then.Fields[i].EditMask:='!99.99.0000;1;_';;TDM.QDogovorBeforePost(DataSet:
TDataSet);(DataSet,'Dogovor','Id_dogov',
s_kod);;TDM.DogovorRefresh;_id:string;_id:=QDogovor.FieldByName('Id_dogov').AsString;.Close;.Open;.Filter:=
'Id_dogov='+s_id;.FindFirst;;TDM.QOplataBeforePost(DataSet:
TDataSet);DataSet.State in [dsInsert]
then.FieldByName('Id_dogov').AsString:=.FieldByName('Id_dogov').AsString;(DataSet,'Oplata','Id_opl',s_kod);;TDM.QOplataBeforeDelete(DataSet:
TDataSet);not CreateDeleteSql('Oplata','Id_opl',DataSet.FieldByName('Id_opl').AsString)
then;.Refresh;;TDM.QOplataBeforeEdit(DataSet: TDataSet);(DataSet);_kod:=
DataSet.FieldByName('Id_opl').AsString;;TDM.QOplataAfterPost(DataSet:
TDataSet);;;TDM.QStoimostAfterPost(DataSet: TDataSet);;;TDM.QStoimostBeforeDelete(DataSet:
TDataSet);not
CreateDeleteSql('Stoimost','Id_opl',DataSet.FieldByName('Id_stoim').AsString)
then;;;TDM.QStoimostBeforeEdit(DataSet: TDataSet);(DataSet);_kod:=
DataSet.FieldByName('Id_stoim').AsString;;TDM.QStoimostBeforePost(DataSet:
TDataSet);DataSet.State in [dsInsert]
then.FieldByName('Id_dogov').AsString:=.FieldByName('Id_dogov').AsString;(DataSet,'Stoimost','Id_stoim',s_kod);;TDM.QOplataAfterOpen(DataSet:
TDataSet);:word;i:=0 to DataSet.FieldCount-1 do beginnot
(DataSet.Fields[i].Lookup or DataSet.Fields[i].Calculated)
then.Fields[i].OnChange:=qrChange;UpperCase(DataSet.Fields[i].FieldName)=
'DATE_OPL'
then.Fields[i].EditMask:='!99.99.0000;1;_';;;TDM.QStoimostAfterOpen(DataSet:
TDataSet);:word;i:=0 to DataSet.FieldCount-1 do beginnot
(DataSet.Fields[i].Lookup or DataSet.Fields[i].Calculated)
then.Fields[i].OnChange:=qrChange;;;TDM.AppException(Sender: TObject; E:
Exception);s_mes,s_msgerr: string;,s_pos,n_kod: integer;
// Ошибки, не связанные с БД
if E is EDivByZero then('Ошибка деления на 0
',mtError,[mbOk],0)
// Ошибка ввода неправ.датыif E is EConvertError then
begin_pos:=pos('is not a valid date',(e).Message);s_pos>0 then
begin_mes:=copy(EconvertError(e).Message,1,_pos-1)+
неверный формат даты!';
MessageDlg (s_mes, mtError, [mbOk], 0)
// Ошибки БДif E is EDBEngineError then begin_mes:='';
// For Sybase5 берем код последней ошибки
//n_kod:=EdbEngErr(e).Err..s[EdbEngErr(e).ErrorCount-1].NatiVe;
// For Sybase8 берем код 2-й ошибки
n_kod:=EdbEngineError(e).Errors[1].NatiVeError;n_kod<>0
then beginn_kod of
-193:// -193 - код ош.Sybase
Нарушение РК
// Коды ошибок BDE
$2601: {9729}
s_mes:='Дублир. записи не допускается';
: //Нарушение FK
s_mes:='Такого кода в справочнике нет';
: // Наруш Not Null
s_mes:='Поле должно быть заполнено';
: // Есть ссылка в дочерних
s_mes:='На запись есть ссылка в
др.таблице! Удалять нельзя';
// -121 - нарушение прав доступа
// -209 - нарушение огранич.на поле табл
// -196 - нарушение уникальности неключ.реквизита
: // Ошибки из триггеров БД
else
{Если ошибка не определена, даем возможность вывести ошибку Delphi}
Application.ShowException(E);;.uEdDogovor;, Messages,
SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, DBCtrls,
Grids, DBGrids, ExtCtrls, Mask, Buttons,DB;= class(TForm): TPanel;: TPanel;:
TPanel;_Oplata: TDBGrid;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;:
TBitBtn;: TBitBtn;_Oplata: TDBNavigator;: TPanel;_Stoimost:
TDBNavigator;_dogov: TDBEdit;: TDBEdit;: TDBEdit;: TDBGrid;: TDBEdit;_KodSt:
TDBLookupComboBox;_Kod_gr: TDBLookupComboBox;FormShow(Sender: TObject);SetButton;BbOkClick(Sender:
TObject);BbCancelClick(Sender: TObject);
{ Private declarations }
{ Public declarations };: TFrmEdDogovor;uDM;
{$R *.dfm}TFrmEdDogovor.FormShow(Sender: TObject);not
DM.QOplata.Active then.QOplata.Open;not DM.QStoimost.Active then.QStoimost.Open;not
DM.QStudent.Active then.QStudent.Open;not DM.QGruppa.Active
then.QGruppa.Open;;;TFrmEdDogovor.SetButton;DM.QDogovor.State in
[dsInsert,dsEdit] then begin
BbOk.Caption:=
'Ñîõðàíèòü'
;.Caption:='Îòìåíà';
DBN_Oplata.Enabled:= false;_Oplata.ReadOnly:= true;begin
BbOk.Caption:=
'Ðåäàêòèðîâàòü'
;.Caption:='Âûõîä';
DBN_Oplata.Enabled:= true;_Oplata.ReadOnly:=
false;;TFrmEdDogovor.BbOkClick(Sender: TObject);DM.QDogovor.State in
[dsInsert, dsEdit]
then.QDogovor.Post.QDogovor.Edit;;;TFrmEdDogovor.BbCancelClick(Sender:
TObject);DM.QDogovor.State = dsEdit then.QDogovor.CancelbeginDM.QDogovor.State
= dsInsert
then.QDogovor.Cancel;;;begin;;;;;Ulib;Windows,sysutils,DB,,Forms,,Dialogs;ClearUpdate(DS:
TDataSet);SetUpdate(sender: Tfield);CreateUpdateSql(DS: TDataSet; qSQL:TQuery;
ntable: string);CreateDeleteSql(ntable: string; fld_name,fld_value:
string):Boolean;dsBeforePost(DS: TDataSet; ntable, fld_name, fld_value:
string);
// Подготовка НД перед редактированием (сброс флага tag в 0)
procedure ClearUpdate(DS: TDataSet);i: word;i:=0 to
ds.FieldCount-1 dods.fields[i].readOnly=false then.Fields[i].tag:=0
//(DataSet.Fields[i].tag AND $FFFE);
// Установка флага tag в
1
procedure SetUpdate(sender: Tfield);
sender.tag:=1;//(Sender.tag OR $1)
end;
// Подготовка оператора SQL на
изменение данных
procedure CreateUpdateSql(DS: TDataSet; qSQL:TQuery; ntable:
string);
// Параметры
// DS - редактируемый набор данных (отсюда
берутся названия и значения полей)
// qSQL - набор данных для формирования SQL
// ntable - изменяемая таблица БДi: word;: boolean;: string;:
char;: integer;:=0;DS.state=dsInsert then
// формирование оператора INSERT
with qSQL do begin
close;.clear;:=NIL;.ADD('INSERT INTO '+ntable+'(');:=false;
// Цикл заполнения имен добавляемых полей
for i:=0 to DS.FieldCount-1 do((DS.Fields[i].tag AND 1)=1)
AND (DS.Fields[i].ReadOnly=false) then beginf
then:=','begin:='';:=true;.ADD(s+DS.Fields[i].FieldName);:=count+1;;.ADD(')
VALUES(');:=DecimalSeparator;:='.';
// Цикл заполнения значений для добавляемых полей
f:=false;i:=0 to DS.FieldCount-1 do((DS.Fields[i].tag AND
1)=1) AND (DS.Fields[i].ReadOnly=false) then beginf
then:=','begin:='';:=true;DS.Fields[i].IsNull then.ADD(s+'null')begin
// в зависимости от типа поляDS.Fields[i] is TnumericField
then.ADD(s+DS.Fields[i].AsString)if (DS.Fields[i] is TStringField) then
beginDS.Fields[i].AsString=''
then.ADD(s+'null').ADD(s+''''+DS.Fields[i].AsString+'''')if
DS.Fields[i].DataType in [ftDate]
then.ADD(s+''''+FormatDateTime('yyyy-mm-dd',DS.Fields[i].AsDateTime)+'''').ADD(s+''''+DS.Fields[i].AsString+'''');;.ADD(')');:=c;
// формирование оператора UPDATEqSQL do
begin.clear;:=NIL;.ADD('UPDATE '+ntable+' SET');:=DecimalSeparator;:='.';
// формирование строк ПОЛЕ=Значение
// для всех изменяемых полей
f:=false;i:=0 to DS.FieldCount-1 do((DS.Fields[i].tag AND
1)=1) AND (DS.Fields[i].ReadOnly=false) then beginf
then:=','begin:='';:=true;:=count+1;DS.Fields[i].IsNull
then.ADD(s+DS.Fields[i].FieldName+'=NULL')DS.Fields[i] is TnumericField
then.ADD(s+DS.Fields[i].FieldName+'='+DS.Fields[i].AsString)if (DS.Fields[i] is
TStringField) then beginDS.Fields[i].AsString=''
then.ADD(s+DS.Fields[i].FieldName+'=NULL').ADD(s+DS.Fields[i].FieldName+'='''+DS.Fields[i].AsString+'''')if
DS.Fields[i].DataType in [ftDate] then.ADD(s+DS.Fields[i].FieldName+'='''+FormatDateTime('yyyy-mm-dd',DS.Fields[i].AsDateTime)+'''').ADD(s+DS.Fields[i].FieldName+'='''+DS.Fields[i].AsString+'''');;:=c;;count=0
then qSQL.SQL.clear;;
// Подготовка и выполнение оператора SQL на удаление данных
function CreateDeleteSql(ntable: string; fld_name, fld_value:
string):Boolean;q: TQuery;: Boolean;:=false;MessageDlg('Удалить запись?',,
[mbYes, mbNo], 0) = mrYes then begin:=TQuery.Create(Application);q do
begin.DatabaseName:='DB';
//close;
//sql.clear;
//dataSource:=NIL;.ADD('DELETE FROM '+ntable);.ADD('WHERE
'+fld_name+'='''+fld_value+'''');;;:=true;.free;:=f;:=f;;
// Выполнение оператора изменения данных и считывание результата
изменения
procedure dsBeforePost(DS: TDataSet; ntable, fld_name,
fld_value: string);i: integer;: boolean;: TFieldNotifyEvent;: Tfield;: Tfield;
screen.cursor:=crSQLWait;
// 1. Формируем оператор SQL на
изменение данных
CreateUpdateSQL(DS,Dm.qSql,ntable);
// 2. Выполняем оператор SQL на
изменение данных
with Dm.qSql dosql.count>0 then beginDS.state=dsInsert
then begin;;:=nil;;
sql.Clear;
// Формируем оператор считывания добавленной записи
if fld_value='' then begin.ADD('select * from '+ntable+'
WHERE '+fld_name+'=:s_kod');
//[0].Value:=DS.FieldByName(fld_name).AsString;.ADD('select * from '+ntable+'
WHERE '+fld_name+'=@@identity');// end dsInsertbegin
// dsUpdate
// Условие поиска изменяемой записи.ADD('WHERE
'+fld_name+'=:kod');
//'''+DS.FieldByName(fld).AsString+'''')[0].Value:=fld_value;;;;.Clear;
// Формируем оператор считывания измененной записи.ADD('select
* from '+ntable+' WHERE '+fld_name+'=:kod');
//'='''+DS.FieldByName(fld_name).AsString+'''');[0].Value:=DS.FieldByName(fld_name).AsString;; // end dsUpdate
// 3. Считываем измененную запись
open;
// 4. Перечитываем поля измененной записи в поля редактируемого НД
for i:=0 to DS.FieldCount-1 do
begin:=DS.Fields[i];:=FindField(q.FieldName);f<>nil then
begin:=q.readOnly;:=q.OnValidate;.readOnly:=false;.OnValidate:=NIL;.value:=f.value;.readOnly:=r;.OnValidate:=o;;;;;.cursor:=crDefault;;end.Urpt;Windows,
SysUtils, Messages, Classes, Graphics, Controls,, ExtCtrls, Forms, QuickRpt,
QRCtrls;= class(TQuickRep): TQRBand;: TQRLabel;: TQRLabel;: TQRBand;:
TQRLabel;: TQRLabel;: TQRShape;: TQRShape;: TQRBand;: TQRDBText;: TQRBand;:
TQRSysData;: TQRBand;: TQRSysData;: TQRLabel;: TQRLabel;: TQRLabel;: TQRLabel;:
TQRShape;: TQRShape;: TQRDBText;: TQRDBText;: TQRGroup;: TQRLabel;: TQRDBText;:
TQRBand;: TQRExpr;: TQRExpr;: TQRBand;: TQRExpr;: TQRExpr;: TQRLabel;:
TQRLabel;: TQRShape;: TQRShape;: TQRShape;: TQRShape;: TQRShape;;: TFrmRpt;uDM;
{$R *.DFM}
end.
Выводы
В ходе выполнения курсовой работы разработан и отлажен программный проект
для осуществления автоматизированного учета оплаты обучения. В его рамках была
спроектирована база данных, включающая в себя информацию о студентах,
факультетах, группах, договорах, а также информация об оплате и стоимости
обучения.
Разработанная программа позволяет вести учет оплаты обучения в
количественном и стоимостном выражении, вести учет процента оплаты и
задолженностей, осуществлять удобный просмотр и редактирование данных, а также
позволяет получить отчет о задолженностях на определенную дату заданного курса.
программный обучение алгоритм отчет
Список
использованных источников
1. Голованов М., Веселов
Создание компонентов в средеDelphi. Руководство разработчика; Е.; Год: 2004,
320 с.;
2. Кренке Д. Теория и практика
построения баз данных: [пер.с англ] / Д. Кренке. - 9 - е изд. - СПб.: Питер,
2005. - 858 с.
3. Delphi 2006 на примерах (+ CD-ROM): Владимир Шупрута
- Москва, БХВ-Петербург, 2006 г.- 528 с.
4. Delphi 7. Основы программирования. Решение типовых
задач. Самоучитель: Л.М. Климова - Санкт-Петербург, КУДИЦ-Образ, 2006 г.- 480
с.
. Delphi. Профессиональное программирование: Дмитрий
Осипов - Москва, Символ-Плюс, 2006 г. - 1056 с.
. Основы программирования в интегрированной среде
Delphi. Практикум: А. Желонкин - Санкт-Петербург, Бином. Лаборатория знаний,
2006 г.- 240 с.
. Программирование в Turbo Pascal. Переход к Delphi (+
CD-ROM): Ю. А. Шпак - Санкт-Петербург, МК-Пресс, 2006 г.- 416 с.
. Программируем в Turbo Delphi: С.А. Любавин - Москва,
НТ Пресс, 2008 г.- 320 с.