
- •«Астраханский государственный университет»
- •Дипломный проект
- •Введение
- •1 Технический проект
- •1.1 Описание предметной области
- •1.2 Обоснование необходимости внедрения ис
- •1.3 Обзор существующих программных продуктов
- •1.4 Постановка задачи
- •2 Рабочий проект
- •2.1 Функциональное проектирование системы
- •2.2 Инфологические проектирование системы
- •2.2.1 Логическое проектирование
- •2.2.2 Физическое проектирование
- •2.3 Используемые классификаторы и системы кодирования
- •2.4 Разработка интерфейса ис
- •3 Программа и методика испытаний разработанной системы
- •3.1 Обоснование выбора субд
- •3.2 Обоснование выбора языка программирования
- •3.7 Входные и выходные данные
- •4 Экономический и социальный эффект от внедрения проекта
- •4.1 Оценка уровня качества разрабатываемого программного продукта
- •4.2 Организация и планирование работ по разработке проекта
- •4.3 Расчет затрат на разработку проекта
- •4.4 Расчет эксплуатационных затрат
- •4.5 Расчет экономического эффекта и показателей экономической эффективности
- •5 Безопасность жизнедеятельности и эргономика
- •5.1 Анализ опасных и вредных производственных факторов на рабочем месте пользователя пэвм
- •5.2 Требования безопасности при работе с пэвм
- •5.3 Инструкция по охране труда для сотрудника одела телекоммуникационных технологий
- •Заключение
- •Список использованных источников
- •Приложение а. Текст программы
- •Акт внедрения
Приложение а. Текст программы
program Repair;
uses
Forms,
uMain in 'uMain.pas' {fmMain},
uDM in 'uDM.pas' {DM: TDataModule},
uOrgs in 'uOrgs.pas' {fmOrgs},
uDiapason in 'uDiapason.pas' {fmDiapason},
uCateg in 'uCateg.pas' {fmCateg},
uParts in 'uParts.pas' {fmParts},
uPersonal in 'uPersonal.pas' {fmPersonal},
uProf in 'uProf.pas' {fmProf},
uRep in 'uRep.pas',
uStatistics in 'uStatistics.pas' {fmStatistics},
uStr in 'uStr.pas',
uInfo in 'uInfo.pas' {fmInfo};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TfmMain, fmMain);
Application.CreateForm(TDM, DM);
Application.CreateForm(TfmOrgs, fmOrgs);
Application.CreateForm(TfmDiapason, fmDiapason);
Application.CreateForm(TfmCateg, fmCateg);
Application.CreateForm(TfmParts, fmParts);
Application.CreateForm(TfmPersonal, fmPersonal);
Application.CreateForm(TfmProf, fmProf);
Application.CreateForm(TfmStatistics, fmStatistics);
Application.CreateForm(TfmInfo, fmInfo);
Application.Run;
end.
unit uCateg;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Grids, DBGrids, DBCtrls, StdCtrls, Buttons;
type
TfmCateg = class(TForm)
DBGrid1: TDBGrid;
Panel1: TPanel;
bbtIns: TBitBtn;
bbtDel: TBitBtn;
bbtSave: TBitBtn;
bbtExit: TBitBtn;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure bbtInsClick(Sender: TObject);
procedure bbtDelClick(Sender: TObject);
procedure bbtSaveClick(Sender: TObject);
procedure bbtExitClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmCateg: TfmCateg;
implementation
uses uDM, uParts, DB;
{$R *.dfm}
procedure TfmCateg.FormShow(Sender: TObject);
begin
DM.tbCateg.Open;
DM.tbCateg.Sort := 'Группа';
end;
procedure TfmCateg.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Набор данных закрывается, если он не используется в других формах:
if not fmParts.Showing then
DM.tbCateg.Close;
end;
procedure TfmCateg.bbtInsClick(Sender: TObject);
begin
DM.tbCateg.Insert;
end;
procedure TfmCateg.bbtDelClick(Sender: TObject);
begin
DM.tbCateg.Delete;
end;
procedure TfmCateg.bbtSaveClick(Sender: TObject);
begin
if DM.tbCateg.State in [dsEdit, dsInsert] then
DM.tbCateg.Post;
end;
procedure TfmCateg.bbtExitClick(Sender: TObject);
begin
Close;
end;
end.
unit uDiapason;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, Buttons, ExtCtrls;
type
TfmDiapason = class(TForm)
Label1: TLabel;
Label2: TLabel;
dtpDateFrom: TDateTimePicker;
dtpDateTo: TDateTimePicker;
bbtCancel: TBitBtn;
bbtOK: TBitBtn;
Bevel1: TBevel;
private
{ Private declarations }
public
{ Public declarations }
end;
function GetDiapason(var DateFrom, DateTo: TDate): Boolean;
var
fmDiapason: TfmDiapason;
implementation
{$R *.dfm}
//Функция возвращает диапазон дат, заданный пользователем:
function GetDiapason(var DateFrom, DateTo: TDate): Boolean;
begin
fmDiapason.dtpDateFrom.Date := DateFrom;
fmDiapason.dtpDateTo.Date := DateTo;
if fmDiapason.ShowModal = mrOK then begin
DateFrom := fmDiapason.dtpDateFrom.Date;
DateTo := fmDiapason.dtpDateTo.Date;
Result := True;
end
else
Result := False;
end;
end.
unit uDM;
interface
uses
SysUtils, Classes, DB, ADODB;
type
TDM = class(TDataModule)
ADOConnection1: TADOConnection;
tbProf: TADOTable;
dsProf: TDataSource;
tbProfID: TAutoIncField;
tbProfDSDesigner: TWideStringField;
tbOrgs: TADOTable;
dsOrgs: TDataSource;
tbOrgsID: TAutoIncField;
tbOrgsDSDesigner2: TWideStringField;
tbOrgsDSDesigner4: TWideStringField;
tbOrgsDSDesigner5: TWideStringField;
tbOrgsDSDesigner6: TWideStringField;
tbOrgsDSDesigner7: TWideStringField;
tbOrgsDSDesigner8: TWideStringField;
tbInfo: TADOTable;
dsInfo: TDataSource;
tbInfoDSDesigner: TWideStringField;
tbInfoDSDesigner2: TWideStringField;
tbInfoDSDesigner3: TWideStringField;
tbInfoDSDesigner4: TWideStringField;
tbInfoDSDesigner5: TWideStringField;
tbInfoDSDesigner6: TWideStringField;
tbInfoDSDesigner7: TWideStringField;
tbInfoDSDesigner8: TWideStringField;
tbParts: TADOTable;
dsParts: TDataSource;
tbPartsDSDesigner: TAutoIncField;
tbPartsDSDesigner2: TWideStringField;
tbPartsDSDesigner3: TWideStringField;
tbPartsDSDesigner4: TWideStringField;
tbPartsDSDesigner6: TBCDField;
tbPersonal: TADOTable;
dsPersonal: TDataSource;
tbPersonalN: TAutoIncField;
tbPersonalDSDesigner: TWideStringField;
tbPersonalID: TIntegerField;
tbPersonalIntegerField: TStringField;
tbPartsField: TCurrencyField;
dsOrders: TDataSource;
dstOrders: TADODataSet;
dstOrdersN: TAutoIncField;
dstOrdersDSDesigner: TDateTimeField;
dstOrdersDSDesigner2: TDateTimeField;
dstOrdersID: TIntegerField;
dstOrdersID3: TIntegerField;
dstOrdersDSDesigner3: TBCDField;
dstOrdersField: TStringField;
dstOrdersIntegerField: TStringField;
dsJobs: TDataSource;
dstJobs: TADODataSet;
dstJobsN: TIntegerField;
dstJobsStringField: TStringField;
dstJobsField2: TCurrencyField;
dstJobsDSDesigner2: TFloatField;
dsOrderParts: TDataSource;
dstOrderParts: TADODataSet;
dstOrderPartsN: TIntegerField;
dstOrderParts_ID: TIntegerField;
dstOrderPartsDSDesigner2: TBCDField;
dstOrderPartsCurrencyField: TCurrencyField;
dstOrderPartsStringField: TStringField;
dstStatPartsCateg: TADODataSet;
dstStatOrderSum: TADODataSet;
BCDField2: TBCDField;
StringField2: TStringField;
dstStatPartsSum: TADODataSet;
BCDField3: TBCDField;
dstStatClientSum: TADODataSet;
dstEmpJobList: TADODataSet;
dstEmpJobListDSDesigner: TWideStringField;
dstEmpJobListDSDesigner3: TFloatField;
tbCateg: TADOTable;
dsCateg: TDataSource;
tbCategID: TAutoIncField;
tbCategDSDesigner: TWideStringField;
tbOrgsDSDesigner: TWideStringField;
dstJobsID: TAutoIncField;
dstJobsDSDesigner: TDateTimeField;
dstJobsDSDesigner4: TDateTimeField;
dstJobsDSDesigner5: TWideStringField;
dstJobsDSDesigner6: TBCDField;
dstJobsID2: TIntegerField;
tbPartsID: TIntegerField;
tbPartsDSDesigner5: TFloatField;
tbCateg2: TADOTable;
AutoIncField1: TAutoIncField;
WideStringField1: TWideStringField;
dsCateg2: TDataSource;
tbPartsField2: TStringField;
dstOrderPartsDSDesigner: TFloatField;
dstMTRList: TADODataSet;
dstMTRListDSDesigner: TWideStringField;
dstMTRListDSDesigner2: TWideStringField;
dstMTRListDSDesigner3: TWideStringField;
dstMTRListDSDesigner4: TFloatField;
dstMTRListDSDesigner5: TBCDField;
dstMTRListDSDesigner6: TFloatField;
dstMTRList_ID: TIntegerField;
dstEmpJobListDSDesigner2: TBCDField;
dstEmpJobListDSDesigner4: TFloatField;
dstEmpJobListDSDesigner5: TDateTimeField;
dstEmpJobListDSDesigner6: TDateTimeField;
dstStatPartsCategDSDesigner2: TFloatField;
dstStatPartsCategField: TStringField;
dstStatClientSumDSDesigner2: TFloatField;
dstStatClientSumField: TStringField;
dstStatPartsSumField: TStringField;
procedure tbPartsCalcFields(DataSet: TDataSet);
procedure dstJobsCalcFields(DataSet: TDataSet);
procedure dstOrderPartsCalcFields(DataSet: TDataSet);
procedure DataModuleDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
DM: TDM;
implementation
{$R *.dfm}
//Расчет суммы каждой позиции аксессуаров на складе:
procedure TDM.tbPartsCalcFields(DataSet: TDataSet);
begin
DataSet.FieldByName('Сумма').Value :=
DataSet.FieldByName('Количество').Value * DataSet.FieldByName('Цена').Value;
end;
//Расчет суммы по каждой позиции продукции по заказу:
procedure TDM.dstJobsCalcFields(DataSet: TDataSet);
begin
DataSet.FieldByName('Сумма').Value :=
DataSet.FieldByName('Количество').Value * DataSet.FieldByName('Стоимость').Value;
end;
//Расчет суммы по каждой позиции затраченной аксессуара по заказу:
procedure TDM.dstOrderPartsCalcFields(DataSet: TDataSet);
begin
DataSet.FieldByName('Сумма').Value :=
DataSet.FieldByName('Количество').Value * DataSet.FieldByName('Цена').Value;
end;
procedure TDM.DataModuleDestroy(Sender: TObject);
begin
ADOConnection1.Close;
end;
end.
unit uInfo;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Mask, DBCtrls, Buttons, ExtCtrls;
type
TfmInfo = class(TForm)
Label1: TLabel;
Label2: TLabel;
DBEdit2: TDBEdit;
Label3: TLabel;
DBEdit3: TDBEdit;
Label4: TLabel;
DBEdit4: TDBEdit;
Label6: TLabel;
DBEdit6: TDBEdit;
Label7: TLabel;
DBEdit7: TDBEdit;
Label8: TLabel;
DBEdit8: TDBEdit;
Label9: TLabel;
DBEdit9: TDBEdit;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
DBMemo1: TDBMemo;
Bevel1: TBevel;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmInfo: TfmInfo;
implementation
uses uDM, DB;
{$R *.dfm}
procedure TfmInfo.FormShow(Sender: TObject);
begin
DM.tbInfo.Open;
end;
procedure TfmInfo.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
DM.tbInfo.Close;
end;
procedure TfmInfo.BitBtn1Click(Sender: TObject);
begin
if DM.tbInfo.State = dsEdit then
DM.tbInfo.Post;
Close;
end;
procedure TfmInfo.BitBtn2Click(Sender: TObject);
begin
DM.tbInfo.Cancel;
Close;
end;
end.
unit uMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, XPMan, ImgList, ActnList, StdActns,
XPStyleActnCtrls, ActnMan, ToolWin, ActnCtrls, ActnMenus, jpeg, ExtCtrls,
DBCtrls, ComCtrls, Grids, DBGrids;
type
TfmMain = class(TForm)
XPManifest1: TXPManifest;
ActionManager1: TActionManager;
ImageList1: TImageList;
FileExit1: TFileExit;
acSpravReq: TAction;
acSpravSpec: TAction;
acSpravClients: TAction;
acSpravStaff: TAction;
acSpravStore: TAction;
acRepStat: TAction;
acSpravGroup: TAction;
Panel2: TPanel;
Panel3: TPanel;
DBGrid2: TDBGrid;
DBGrid1: TDBGrid;
Splitter2: TSplitter;
Panel4: TPanel;
bbtIns: TBitBtn;
bbtDel: TBitBtn;
bbtSave: TBitBtn;
GroupBox1: TGroupBox;
chbDate1: TCheckBox;
chbDate2: TCheckBox;
dtpDate1: TDateTimePicker;
dtpDate2: TDateTimePicker;
chbClient: TCheckBox;
dblcbClient: TDBLookupComboBox;
DBGrid3: TDBGrid;
Splitter1: TSplitter;
acRepMTRList: TAction;
bbtContract: TBitBtn;
bbtAppendix: TBitBtn;
bbtAct: TBitBtn;
bbtBill: TBitBtn;
bbtFact: TBitBtn;
acRepJobs: TAction;
acRepDefect: TAction;
ActionMainMenuBar1: TActionMainMenuBar;
procedure acSpravReqExecute(Sender: TObject);
procedure acSpravSpecExecute(Sender: TObject);
procedure acSpravClientsExecute(Sender: TObject);
procedure acSpravStaffExecute(Sender: TObject);
procedure acSpravStoreExecute(Sender: TObject);
procedure acRepStatExecute(Sender: TObject);
procedure acSpravGroupExecute(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure bbtPrintClick(Sender: TObject);
procedure DBGrid1TitleClick(Column: TColumn);
procedure chbDate1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure bbtInsClick(Sender: TObject);
procedure bbtSaveClick(Sender: TObject);
procedure bbtDelClick(Sender: TObject);
procedure DBGrid3EditButtonClick(Sender: TObject);
procedure DBGrid1Exit(Sender: TObject);
procedure DBGrid2Exit(Sender: TObject);
procedure DBGrid3Exit(Sender: TObject);
procedure acRepMTRListExecute(Sender: TObject);
procedure bbtContractClick(Sender: TObject);
procedure bbtAppendixClick(Sender: TObject);
procedure bbtActClick(Sender: TObject);
procedure bbtBillClick(Sender: TObject);
procedure bbtFactClick(Sender: TObject);
procedure acRepJobsExecute(Sender: TObject);
procedure acRepDefectExecute(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmMain: TfmMain;
implementation
uses FileCtrl, uInfo, uProf, uOrgs, uDM, uPersonal, uParts, uStatistics,
uDiapason, uRep, uCateg, ADODB, DB;
var
GridID: 1..3; //Хранит номер таблицы-Грида на форме
{$R *.dfm}
procedure TfmMain.acSpravReqExecute(Sender: TObject);
begin
fmInfo.Show;
end;
procedure TfmMain.acSpravSpecExecute(Sender: TObject);
begin
fmProf.Show;
end;
procedure TfmMain.acSpravClientsExecute(Sender: TObject);
begin
fmOrgs.Show;
end;
procedure TfmMain.acSpravStaffExecute(Sender: TObject);
begin
fmPersonal.Show;
end;
procedure TfmMain.acSpravStoreExecute(Sender: TObject);
begin
fmParts.Show;
end;
procedure TfmMain.acRepStatExecute(Sender: TObject);
begin
fmStatistics.Show;
end;
procedure TfmMain.acSpravGroupExecute(Sender: TObject);
begin
fmCateg.Show;
end;
procedure TfmMain.FormShow(Sender: TObject);
begin
DM.dstOrders.Open;
DM.dstJobs.Open;
DM.dstOrderParts.Open;
dtpDate1.Date := Date;
dtpDate2.Date := Date;
chbDate1Click(Self);
DBGrid1.SetFocus;
end;
procedure TfmMain.bbtPrintClick(Sender: TObject);
begin
Rep_Universal(DBGrid1, 7, 'Журнал заказов');
end;
//Сортировка данных по выбранному полю:
procedure TfmMain.DBGrid1TitleClick(Column: TColumn);
begin
try
(DBGrid1.DataSource.DataSet as TADODataset).Sort := Column.FieldName;
except
Application.MessageBox('Сортировка по данному полю невозможна', 'Информация', MB_OK+MB_ICONINFORMATION)
end;
end;
procedure TfmMain.chbDate1Click(Sender: TObject);
var
Filter: string;
begin
Filter := '';
if chbDate1.Checked then
begin
if Filter <> '' then
Filter := Filter + ' and ';
Filter := Filter + 'ДатаПриема >= ' + QuotedStr(DateToStr(dtpDate1.Date));
end;
if chbDate2.Checked then
begin
if Filter <> '' then
Filter := Filter + ' and ';
Filter := Filter + 'ДатаПриема <= ' + QuotedStr(DateToStr(dtpDate2.Date));
end;
if chbClient.Checked and (dblcbClient.KeyValue <> Null) then
begin
if Filter <> '' then
Filter := Filter + ' and ';
Filter := Filter + 'КлиентID = ' + IntToStr(dblcbClient.KeyValue);
end;
if Filter <> '' then
begin
DM.dstOrders.Filter := Filter;
DM.dstOrders.Filtered := True;
end
else
DM.dstOrders.Filtered := False;
end;
procedure TfmMain.FormCreate(Sender: TObject);
begin
dtpDate1.Date := Date;
dtpDate2.Date := Date;
bbtContract.Caption := 'Печать' + Chr(10) + 'договора';
bbtAppendix.Caption := 'Печать' + Chr(10) + 'Приложения';
bbtAct.Caption := 'Печать акта' + Chr(10) + 'сдачи-приемки';
bbtFact.Caption := 'Печать' + Chr(10) + 'счета-фактуры';
end;
//В зависимости от номера Грида, в котором находился курсор до нажатия кнопки,
//выполняется добавление записи в соответствующий набор данных:
procedure TfmMain.bbtInsClick(Sender: TObject);
begin
case GridID of
1: DM.dstOrders.Insert;
2: DM.dstJobs.Insert;
3: DM.dstOrderParts.Insert;
end;
end;
//В зависимости от номера Грида, в котором находился курсор до нажатия кнопки,
//выполняется сохранение записи в соответствующий набор данных:
procedure TfmMain.bbtSaveClick(Sender: TObject);
begin
case GridID of
1: if DM.dstOrders.State in [dsEdit, dsInsert] then
DM.dstOrders.Post;
2: if DM.dstJobs.State in [dsEdit, dsInsert] then
DM.dstJobs.Post;
3: if DM.dstOrderParts.State in [dsEdit, dsInsert] then
DM.dstOrderParts.Post;
end;
end;
//В зависимости от номера Грида, в котором находился курсор до нажатия кнопки,
//выполняется удаление записи в соответствующий набор данных:
procedure TfmMain.bbtDelClick(Sender: TObject);
begin
case GridID of
1: DM.dstOrders.Delete;
2: DM.dstJobs.Delete;
3: DM.dstOrderParts.Delete;
end;
end;
//При щелчке по кнопке "..." в ячейке "Запчасть" в DBGrid1 на экран выводится
//завпчастей для выбора нужного из списка:
procedure TfmMain.DBGrid3EditButtonClick(Sender: TObject);
begin
fmParts.bbtGo.Visible := True;
if fmParts.ShowModal = mrOK then
begin
if not (DM.dstOrderParts.State in [dsEdit, dsInsert]) then
DM.dstOrderParts.Edit;
DM.dstOrderParts.FieldByName('МЦ_ID').Value := DM.tbParts.FieldByName('Шифр').Value;
DM.dstOrderParts.FieldByName('Цена').Value := DM.tbParts.FieldByName('Цена').Value
end;
fmParts.bbtGo.Visible := False;
end;
procedure TfmMain.DBGrid1Exit(Sender: TObject);
begin
GridID := 1;
end;
procedure TfmMain.DBGrid2Exit(Sender: TObject);
begin
GridID := 2;
end;
procedure TfmMain.DBGrid3Exit(Sender: TObject);
begin
GridID := 3;
end;
procedure TfmMain.bbtContractClick(Sender: TObject);
begin
Rep_Contract;
end;
procedure TfmMain.bbtAppendixClick(Sender: TObject);
begin
Rep_Appendix;
end;
procedure TfmMain.bbtActClick(Sender: TObject);
begin
Rep_Act;
end;
procedure TfmMain.bbtBillClick(Sender: TObject);
begin
Rep_Bill;
end;
procedure TfmMain.bbtFactClick(Sender: TObject);
begin
Rep_Fact;
end;
procedure TfmMain.acRepMTRListExecute(Sender: TObject);
var
Date1, Date2: TDate;
begin
Date1 := Date;
Date2 := Date;
if GetDiapason(Date1, Date2) then
Rep_MTR(Date1, Date2);
end;
procedure TfmMain.acRepJobsExecute(Sender: TObject);
var
Date1, Date2: TDate;
begin
Date1 := Date;
Date2 := Date;
if GetDiapason(Date1, Date2) then
Rep_JobList(Date1, Date2);
end;
procedure TfmMain.acRepDefectExecute(Sender: TObject);
begin
Rep_Defect;
end;
end.
unit uOrgs;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Grids, DBGrids, DBCtrls, StdCtrls, Buttons, Mask;
type
TfmOrgs = class(TForm)
Panel1: TPanel;
bbtExit: TBitBtn;
Panel2: TPanel;
DBGrid1: TDBGrid;
bbtPrint: TBitBtn;
GroupBox1: TGroupBox;
DBEdit1: TDBEdit;
Label1: TLabel;
Label5: TLabel;
DBEdit5: TDBEdit;
Label3: TLabel;
DBEdit3: TDBEdit;
DBEdit6: TDBEdit;
Label6: TLabel;
DBMemo1: TDBMemo;
Label7: TLabel;
Label8: TLabel;
DBEdit8: TDBEdit;
Label9: TLabel;
DBEdit9: TDBEdit;
bbtIns: TBitBtn;
bbtDel: TBitBtn;
bbtSave: TBitBtn;
procedure FormShow(Sender: TObject);
procedure bbtPrintClick(Sender: TObject);
procedure DBGrid1TitleClick(Column: TColumn);
procedure bbtInsClick(Sender: TObject);
procedure bbtDelClick(Sender: TObject);
procedure bbtSaveClick(Sender: TObject);
procedure bbtExitClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmOrgs: TfmOrgs;
implementation
uses uDM, uRep, ADODB, DB;
{$R *.dfm}
procedure TfmOrgs.FormShow(Sender: TObject);
begin
DM.tbOrgs.Open;
end;
procedure TfmOrgs.bbtPrintClick(Sender: TObject);
begin
Rep_Universal(DBGrid1, 7, 'Организации-заказчики');
end;
//Сортировка данных в таблице по выбранному столбцу:
procedure TfmOrgs.DBGrid1TitleClick(Column: TColumn);
begin
try
(DBGrid1.DataSource.DataSet as TADOTable).Sort := Column.FieldName;
except
Application.MessageBox('Сортировка по данному полю невозможна', 'Информация', MB_OK+MB_ICONINFORMATION)
end;
end;
procedure TfmOrgs.bbtInsClick(Sender: TObject);
begin
DM.tbOrgs.Insert;
end;
procedure TfmOrgs.bbtDelClick(Sender: TObject);
begin
DM.tbOrgs.Delete;
end;
procedure TfmOrgs.bbtSaveClick(Sender: TObject);
begin
if DM.tbOrgs.State in [dsEdit, dsInsert] then
DM.tbOrgs.Post;
end;
procedure TfmOrgs.bbtExitClick(Sender: TObject);
begin
Close;
end;
end.
unit uParts;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Grids, DBGrids, DBCtrls, StdCtrls, Buttons;
type
TfmParts = class(TForm)
DBGrid1: TDBGrid;
Panel1: TPanel;
bbtGo: TBitBtn;
bbtIns: TBitBtn;
bbtDel: TBitBtn;
bbtSave: TBitBtn;
bbtPrint: TBitBtn;
bbtExit: TBitBtn;
Panel2: TPanel;
dblcbGroup: TDBLookupComboBox;
CheckBox1: TCheckBox;
GroupBox1: TGroupBox;
edName: TEdit;
procedure bbtPrintClick(Sender: TObject);
procedure bbtExitClick(Sender: TObject);
procedure bbtInsClick(Sender: TObject);
procedure bbtDelClick(Sender: TObject);
procedure bbtSaveClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure CheckBox1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure edNameChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmParts: TfmParts;
implementation
uses uDM, uRep, ADODB, DB, uCateg;
{$R *.dfm}
procedure TfmParts.bbtPrintClick(Sender: TObject);
begin
if CheckBox1.Checked then
Rep_Universal(DBGrid1, 7, dblcbGroup.Text + ' на складе')
else
Rep_Universal(DBGrid1, 7, 'МТР на складе');
end;
procedure TfmParts.bbtExitClick(Sender: TObject);
begin
Close;
end;
procedure TfmParts.bbtInsClick(Sender: TObject);
begin
DM.tbParts.Insert;
end;
procedure TfmParts.bbtDelClick(Sender: TObject);
begin
DM.tbParts.Delete;
end;
procedure TfmParts.bbtSaveClick(Sender: TObject);
begin
if DM.tbParts.State in [dsEdit, dsInsert] then
DM.tbParts.Post;
end;
procedure TfmParts.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Набор данных закрывается, если он не используется в других формах:
if not fmCateg.Showing then
DM.tbCateg.Close;
end;
//В зависимости от состояния флажка выполняется отбор запчастей по выбранному виду МТР:
procedure TfmParts.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked then
begin
DM.tbCateg.Open;
DBGrid1.Columns[6].Visible := False; //Скрывается поле вида МТР
end
else
begin
DM.tbCateg.Close;
DBGrid1.Columns[6].Visible := True; //Отображается поле вида МТР
end;
DM.tbParts.Requery([]);
end;
procedure TfmParts.FormCreate(Sender: TObject);
begin
DM.tbCateg.Open;
DM.tbCateg.Sort := 'Группа';
DM.tbCateg.First;
DM.tbParts.Open;
DM.tbParts.Sort := 'ГруппаID, Наименование';
dblcbGroup.KeyValue := DM.tbCateg.FieldByName('ID').Value;
end;
procedure TfmParts.FormShow(Sender: TObject);
begin
CheckBox1Click(Self);
end;
//Поиск МТР по наименованию:
procedure TfmParts.edNameChange(Sender: TObject);
begin
DM.tbParts.Locate('Наименование', edName.Text, [loPartialKey, loCaseInsensitive]);
end;
end.
unit uPersonal;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Grids, DBGrids, DBCtrls, StdCtrls, Buttons;
type
TfmPersonal = class(TForm)
DBGrid1: TDBGrid;
Panel1: TPanel;
bbtIns: TBitBtn;
bbtDel: TBitBtn;
bbtSave: TBitBtn;
bbtPrint: TBitBtn;
bbtExit: TBitBtn;
procedure FormShow(Sender: TObject);
procedure DBGrid1TitleClick(Column: TColumn);
procedure bbtPrintClick(Sender: TObject);
procedure bbtExitClick(Sender: TObject);
procedure bbtInsClick(Sender: TObject);
procedure bbtDelClick(Sender: TObject);
procedure bbtSaveClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmPersonal: TfmPersonal;
implementation
uses uDM, uRep, ADODB, DB;
{$R *.dfm}
procedure TfmPersonal.FormShow(Sender: TObject);
begin
DM.tbPersonal.Open;
end;
//Сортировка данных в таблице по выбранному столбцу:
procedure TfmPersonal.DBGrid1TitleClick(Column: TColumn);
begin
try
(DBGrid1.DataSource.DataSet as TADOTable).Sort := Column.FieldName;
except
Application.MessageBox('Сортировка по данному полю невозможна', 'Информация', MB_OK+MB_ICONINFORMATION)
end;
end;
procedure TfmPersonal.bbtPrintClick(Sender: TObject);
begin
Rep_Universal(DBGrid1, 3, 'Ответственные лица');
end;
procedure TfmPersonal.bbtExitClick(Sender: TObject);
begin
Close;
end;
procedure TfmPersonal.bbtInsClick(Sender: TObject);
begin
DM.tbPersonal.Insert;
end;
procedure TfmPersonal.bbtDelClick(Sender: TObject);
begin
DM.tbPersonal.Delete;
end;
procedure TfmPersonal.bbtSaveClick(Sender: TObject);
begin
if DM.tbPersonal.State in [dsEdit, dsInsert] then
DM.tbPersonal.Post;
end;
end.
unit uProf;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Grids, DBGrids, DBCtrls, StdCtrls, Buttons;
type
TfmProf = class(TForm)
DBGrid1: TDBGrid;
Panel1: TPanel;
bbtIns: TBitBtn;
bbtDel: TBitBtn;
bbtSave: TBitBtn;
bbtExit: TBitBtn;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure bbtInsClick(Sender: TObject);
procedure bbtDelClick(Sender: TObject);
procedure bbtSaveClick(Sender: TObject);
procedure bbtExitClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmProf: TfmProf;
implementation
uses uDM, uPersonal, DB;
{$R *.dfm}
procedure TfmProf.FormShow(Sender: TObject);
begin
DM.tbProf.Open;
end;
procedure TfmProf.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Набор данных закрывается, если он не используется в других формах:
if not fmPersonal.Showing then
DM.tbProf.Close;
end;
procedure TfmProf.bbtInsClick(Sender: TObject);
begin
DM.tbProf.Insert;
end;
procedure TfmProf.bbtDelClick(Sender: TObject);
begin
DM.tbProf.Delete;
end;
procedure TfmProf.bbtSaveClick(Sender: TObject);
begin
if DM.tbProf.State in [dsEdit, dsInsert] then
DM.tbProf.Post;
end;
procedure TfmProf.bbtExitClick(Sender: TObject);
begin
Close;
end;
end.
unit uRep;
//Модуль для формирования отчетов и документов
interface
uses
Windows, SysUtils, Classes, ComObj, DB, Controls, Forms, ADODB, Math, DBGrids;
procedure Rep_Universal(ADBGrid: TDBGrid; NumCol: Integer; ACaption: string);
procedure Rep_MTR(Date1, Date2: TDate);
procedure Rep_JobList(Date1, Date2: TDate);
procedure Rep_Contract;
procedure Rep_Appendix;
procedure Rep_Act;
procedure Rep_Bill;
procedure Rep_Fact;
procedure Rep_Defect;
function GetRightDate(ADate: TDateTime): string;
implementation
uses
uDM, DateUtils, Dialogs, uStr;
//Формирование отчета по выбранному набору данных (вывод заголовков видимых
//полей и их значений):
procedure Rep_Universal(ADBGrid: TDBGrid; NumCol: Integer; ACaption: string);
var
Excel: Variant;
i, j, Width: Integer;
begin
Excel := CreateOleObject('Excel.Application');
Screen.Cursor := crHourGlass;
try
try
Excel.Application.EnableEvents := False;
Excel.Workbooks.Add;
for i:=0 to NumCol-1 do
begin
//Вывод в шапку таблицы названий полей из DBGrid'а:
Excel.Cells[5,i+1] := ADBGrid.Columns[i].Title.Caption;
//Форматирование заголовка:
Width := Min(30, Trunc(ADBGrid.Columns[i].Width * 0.2));
Excel.Cells[5,i+1].ColumnWidth := Width;
Excel.Cells[5,i+1].Font.Bold := True;
end;
Excel.Cells[1,1] := Date;
Excel.Cells[3,1] := ACaption;
Excel.Cells[3,1].Font.Bold := True;
Excel.Cells[3,1].Font.Size := 12;
i := 5;
//Экспорт данных из таблиц БД:
with ADBGrid.DataSource.DataSet do
begin
DisableControls; //Отключаем сетку на время формирования отчета
First;
while not Eof do
begin
Inc(i);
//Выводятся NumCol первых полей таблицы, отображенных в DBGrid'е:
for j:=0 to NumCol-1 do
begin
Excel.Cells[i,j+1].NumberFormat := '@';
Excel.Cells[i,j+1] := FieldByName(ADBGrid.Columns[j].FieldName).DisplayText;
end;
Next;
end;
end; //with
Excel.Application.EnableEvents := True;
Excel.Visible := True;
except
Excel.Quit;
end;
finally
ADBGrid.DataSource.DataSet.EnableControls;
Screen.Cursor := crDefault;
ADBGrid.Enabled := True;
end;
end;
//Формирование списка потребности в МТР за указанный диапазон дат:
procedure Rep_MTR(Date1, Date2: TDate);
var
WorkbookName, Categ: string;
Excel: Variant;
i, j, PosInc: Integer;
Sum, SumItogo: Currency;
//Добавление новой шапки таблицы для новой категории МТР:
procedure AddHeader;
begin
if DM.dstMTRList.FieldByName('Группа').AsString <> Categ then
begin
Excel.Cells[i+PosInc,7] := Sum;
Sum := 0;
j := 0;
Inc(i,2);
Excel.Rows.Item[PosInc+i].Select;
Excel.Selection.Insert;
Excel.Selection.Insert;
Excel.Selection.Insert;
Excel.Selection.Insert;
Excel.Selection.Insert;
Excel.Rows.Item[3].Select;
Excel.Selection.Copy;
Excel.Rows.Item[PosInc+i].Select;
Excel.ActiveSheet.Paste;
Excel.Rows.Item[4].Select;
Excel.Selection.Copy;
Excel.Rows.Item[PosInc+i+1].Select;
Excel.ActiveSheet.Paste;
Excel.Rows.Item[5].Select;
Excel.Selection.Copy;
Excel.Rows.Item[PosInc+i+2].Select;
Excel.ActiveSheet.Paste;
//Копирование строки "Итого":
Excel.Rows.Item[PosInc+i-2].Select;
Excel.Selection.Copy;
Excel.Rows.Item[PosInc+i+3].Select;
Excel.ActiveSheet.Paste;
Excel.Application.CutCopyMode := False;
Categ := DM.dstMTRList.FieldByName('Группа').AsString;
Excel.Cells[PosInc+i,3] := Categ;
Inc(i,2);
end;
end;
begin
//Шаблон хранится в папке Шаблоны:
WorkbookName := GetCurrentDir + '\Templates\' + 'Потребность МТР.xlt';
Excel := CreateOleObject('Excel.Application');
Screen.Cursor := crHourGlass;
try
try
Excel.Workbooks.Open(WorkbookName);
//Экспорт данных из таблицы БД:
with DM do
begin
i := 0;
SumItogo := 0; //Общая сумма МТР
Sum := 0; //Cумма по виду МТР
PosInc := 5;
Excel.Cells[1,1] := 'Потребность в МТР за период' + Chr(10) +
'с ' + DateToStr(Date1) + ' по ' + DateToStr(Date2);
//Запрос перечня потребности в МТР за заданный период:
dstMTRList.Parameters.ParamByName('pDate1').Value := Date1;
dstMTRList.Parameters.ParamByName('pDate2').Value := Date2;
dstMTRList.Parameters.ParamByName('pDate11').Value := Date1;
dstMTRList.Parameters.ParamByName('pDate22').Value := Date2;
dstMTRList.Open;
dstMTRList.First;
Categ := dstMTRList.FieldByName('Группа').AsString;
Excel.Cells[3,3] := Categ;
//Цикл по МТР:
while not dstMTRList.Eof do
begin
AddHeader;
//Добавление новой строки для МТР:
if j <> 0 then
begin
Excel.Rows.Item[PosInc+i].Select;
Excel.Selection.Insert;
Excel.Rows.Item[5].Select;
Excel.Selection.Copy;
Excel.Rows.Item[PosInc+i].Select;
Excel.ActiveSheet.Paste;
Excel.Application.CutCopyMode := False;
end;
Excel.Cells[i+PosInc,1] := j+1;
Excel.Cells[i+PosInc,2] := FormatFloat('0000', dstMTRList.FieldByName('МЦ_ID').AsInteger);
Excel.Cells[i+PosInc,3] := dstMTRList.FieldByName('Наименование').AsString;
Excel.Cells[i+PosInc,4] := dstMTRList.FieldByName('ЕдИзм').AsString;
Excel.Cells[i+PosInc,5] := dstMTRList.FieldByName('Количество').AsFloat;
Excel.Cells[i+PosInc,6] := dstMTRList.FieldByName('Цена').AsCurrency;
Excel.Cells[i+PosInc,7] := dstMTRList.FieldByName('Сумма').AsCurrency;
Sum := Sum + dstMTRList.FieldByName('Сумма').AsCurrency;
SumItogo := SumItogo + dstMTRList.FieldByName('Сумма').AsCurrency;
Inc(i);
Inc(j);
dstMTRList.Next;
end; //while not dstMTRList.Eof
dstMTRList.Close;
Excel.Cells[i+PosInc,7] := Sum;
Excel.Cells[i+7,7] := SumItogo;
end; //with
Excel.Visible := True;
except
Excel.Quit;
end;
finally
Screen.Cursor := crDefault;
end;
end;
//Формирование списка выполненных работ за указанный диапазон дат:
procedure Rep_JobList(Date1, Date2: TDate);
var
WorkbookName: string;
Excel: Variant;
i, PosInc: Integer;
Sum: Currency;
begin
//Шаблон хранится в папке Шаблоны:
WorkbookName := GetCurrentDir + '\Templates\' + 'Работы.xlt';
Excel := CreateOleObject('Excel.Application');
Screen.Cursor := crHourGlass;
try
try
Excel.Workbooks.Open(WorkbookName);
//Экспорт данных из таблицы БД:
with DM do
begin
i := 0;
PosInc := 4;
Excel.Cells[1,1] := 'Выполненные работы за период' + Chr(10) +
'за период с ' + DateToStr(Date1) + ' по ' + DateToStr(Date2);
//Запрос перечня работ за заданный период:
dstEmpJobList.Parameters.ParamByName('pDate1').Value := Date1;
dstEmpJobList.Parameters.ParamByName('pDate2').Value := Date2;
dstEmpJobList.Parameters.ParamByName('pDate11').Value := Date1;
dstEmpJobList.Parameters.ParamByName('pDate22').Value := Date2;
dstEmpJobList.Open;
Sum := 0; //Сумма работ
dstEmpJobList.First;
//Цикл по работам:
while not dstEmpJobList.Eof do
begin
//Добавление новой строки для работы:
if i <> 0 then
begin
Excel.Rows.Item[PosInc+i].Select;
Excel.Selection.Insert;
Excel.Rows.Item[PosInc+i-1].Select;
Excel.Selection.Copy;
Excel.Rows.Item[PosInc+i].Select;
Excel.ActiveSheet.Paste;
Excel.Application.CutCopyMode := False;
end;
Excel.Cells[i+PosInc,1] := i+1;
Excel.Cells[i+PosInc,2] := dstEmpJobList.FieldByName('ДатаС').AsString;
Excel.Cells[i+PosInc,3] := dstEmpJobList.FieldByName('ДатаПо').AsString;
Excel.Cells[i+PosInc,4] := dstEmpJobList.FieldByName('Работа').AsString;
Excel.Cells[i+PosInc,5] := dstEmpJobList.FieldByName('Количество').AsFloat;
Excel.Cells[i+PosInc,6] := dstEmpJobList.FieldByName('Стоимость').AsCurrency;
Excel.Cells[i+PosInc,7] := dstEmpJobList.FieldByName('Сумма').AsCurrency;
Inc(i);
Sum := Sum + dstEmpJobList.FieldByName('Сумма').AsCurrency;
dstEmpJobList.Next;
end; //while not dstEmpJobList.Eof
Excel.Cells[i+PosInc,7] := Sum;
dstEmpJobList.Close;
end; //with
Excel.Visible := True;
except
Excel.Quit;
end;
finally
Screen.Cursor := crDefault;
end;
end;
//Формирование договора:
procedure Rep_Contract;
var
ObjWord: Variant;
begin
ObjWord := CreateOleObject('Word.Application');
Screen.Cursor := crHourGlass;
try
try
ObjWord.Documents.Open(GetCurrentDir + '\Templates\Договор.dot');
//Данные договора и заказа:
ObjWord.Selection.Goto(Name := 'НомерДог');
ObjWord.Selection.TypeText(Text := FormatFloat('0000', DM.dstOrders.FieldByName('NЗаказа').AsFloat));
ObjWord.Selection.Goto(Name := 'ДатаДог');
ObjWord.Selection.TypeText(Text := GetRightDate(DM.dstOrders.FieldByName('ДатаПриема').AsDateTime));
ObjWord.Selection.Goto(Name := 'ДатаЗаказа');
ObjWord.Selection.TypeText(Text := GetRightDate(DM.dstOrders.FieldByName('ДатаПриема').AsDateTime));
ObjWord.Selection.Goto(Name := 'ДатаОконч');
ObjWord.Selection.TypeText(Text := GetRightDate(DM.dstOrders.FieldByName('ДатаСдачи').AsDateTime));
//Данные клиента:
ObjWord.Selection.Goto(Name := 'Заказчик');
ObjWord.Selection.TypeText(Text := DM.tbOrgs.FieldByName('Наименование').AsString);
ObjWord.Selection.Goto(Name := 'Заказчик2');
ObjWord.Selection.TypeText(Text := DM.tbOrgs.FieldByName('Наименование').AsString);
ObjWord.Selection.Goto(Name := 'Адрес');
ObjWord.Selection.TypeText(Text := DM.tbOrgs.FieldByName('Адрес').AsString);
ObjWord.Selection.Goto(Name := 'ИННЗак');
ObjWord.Selection.TypeText(Text := DM.tbOrgs.FieldByName('ИНН').AsString);
ObjWord.Selection.Goto(Name := 'РеквизитыЗак');
ObjWord.Selection.TypeText(Text := DM.tbOrgs.FieldByName('Реквизиты').AsString);
//Реквизиты компании:
DM.tbInfo.Open;
ObjWord.Selection.Goto(Name := 'Орг');
ObjWord.Selection.TypeText(Text := DM.tbInfo.FieldByName('Наименование').AsString);
ObjWord.Selection.Goto(Name := 'Орг2');
ObjWord.Selection.TypeText(Text := DM.tbInfo.FieldByName('Наименование').AsString);
ObjWord.Selection.Goto(Name := 'ЮрАдрес');
ObjWord.Selection.TypeText(Text := DM.tbInfo.FieldByName('Адрес').AsString);
ObjWord.Selection.Goto(Name := 'ПочтАдрес');
ObjWord.Selection.TypeText(Text := DM.tbInfo.FieldByName('Адрес').AsString);
ObjWord.Selection.Goto(Name := 'ИНН');
ObjWord.Selection.TypeText(Text := DM.tbInfo.FieldByName('ИНН').AsString);
ObjWord.Selection.Goto(Name := 'Реквизиты');
ObjWord.Selection.TypeText(Text := DM.tbInfo.FieldByName('Реквизиты').AsString);
ObjWord.Selection.Goto(Name := 'ГенДир');
ObjWord.Selection.TypeText(Text := DM.tbInfo.FieldByName('ГенДиректор').AsString);
ObjWord.Selection.Goto(Name := 'ГенДир2');
ObjWord.Selection.TypeText(Text := DM.tbInfo.FieldByName('ГенДиректор').AsString);
DM.tbInfo.Close;
ObjWord.Visible := True;
except
ObjWord.Quit;
end;
finally
Screen.Cursor := crDefault;
end;
end;
//Формирование списка работ по Договору (приложения к Договору):
procedure Rep_Appendix;
var
WorkbookName: string;
Excel: Variant;
i, j, PosInc: Integer;
Sum, SumItogo: Currency;
begin
//Шаблон хранится в папке Шаблоны:
WorkbookName := GetCurrentDir + '\Templates\' + 'Прил к Договору.xlt';
Excel := CreateOleObject('Excel.Application');
Screen.Cursor := crHourGlass;
try
try
Excel.Workbooks.Open(WorkbookName);
//Экспорт данных из таблицы БД:
with DM do
begin
i := 0;
j := 0;
SumItogo := 0; //Общая сумма работ
PosInc := 7;
Excel.Cells[1,4] := FormatFloat('0000', dstOrders.FieldByName('NЗаказа').AsInteger) +
' от ' + GetRightDate(dstOrders.FieldByName('ДатаПриема').AsDateTime);
Excel.Cells[3,2] := dstOrders.FieldByName('Клиент').AsString;
//Цикл по работам:
dstJobs.First;
Sum := 0; //Сумма работ
while not dstJobs.Eof do
begin
//Добавление новой строки для работы:
if i <> 0 then
begin
Excel.Rows.Item[PosInc+i].Select;
Excel.Selection.Insert;
Excel.Rows.Item[PosInc].Select;
Excel.Selection.Copy;
Excel.Rows.Item[PosInc+i].Select;
Excel.ActiveSheet.Paste;
Excel.Application.CutCopyMode := False;
end;
Excel.Cells[i+PosInc,1] := i+1;
Excel.Cells[i+PosInc,2] := dstJobs.FieldByName('Работа').AsString;
Excel.Cells[i+PosInc,3] := dstJobs.FieldByName('Работник').AsString;
Excel.Cells[i+PosInc,4] := dstJobs.FieldByName('Стоимость').AsCurrency;
Excel.Cells[i+PosInc,5] := FormatFloat('0,00', dstJobs.FieldByName('Количество').AsFloat);
Excel.Cells[i+PosInc,6] := dstJobs.FieldByName('Сумма').AsCurrency;
Inc(i);
Sum := Sum + dstJobs.FieldByName('Сумма').AsCurrency;
dstJobs.Next;
end; //while not dstJobs.Eof
Excel.Cells[i+PosInc,6] := Sum;
Inc(i, 4);
SumItogo := SumItogo + Sum;
//Цикл по МТР:
dstOrderParts.First;
Sum := 0; //Сумма МТР
while not dstOrderParts.Eof do
begin
//Добавление новой строки для МТР:
if j <> 0 then
begin
Excel.Rows.Item[PosInc+i].Select;
Excel.Selection.Insert;
Excel.Rows.Item[PosInc+i-1].Select;
Excel.Selection.Copy;
Excel.Rows.Item[PosInc+i].Select;
Excel.ActiveSheet.Paste;
Excel.Application.CutCopyMode := False;
end;
Excel.Cells[i+PosInc,1] := j+1;
Excel.Cells[i+PosInc,2] := dstOrderParts.FieldByName('Материал').AsString;
Excel.Cells[i+PosInc,3] := tbParts.FieldByName('ЕдИзм').AsString;
Excel.Cells[i+PosInc,4] := dstOrderParts.FieldByName('Цена').AsCurrency;
Excel.Cells[i+PosInc,5] := FormatFloat('0,00', dstOrderParts.FieldByName('Количество').AsFloat);
Excel.Cells[i+PosInc,6] := dstOrderParts.FieldByName('Сумма').AsCurrency;
Inc(j);
Inc(i);
Sum := Sum + dstOrderParts.FieldByName('Сумма').AsCurrency;
dstOrderParts.Next;
end; //while not dstJobs.Eof
Excel.Cells[i+PosInc,6] := Sum;
SumItogo := SumItogo + Sum;
Excel.Cells[i+PosInc+2,6] := SumItogo;
Excel.Cells[i+PosInc+4,2] := SumToTxt(Format('%.2f', [SumItogo]));
Excel.Cells[i+PosInc+5,4] := dstOrders.FieldByName('Работник').AsString;
end; //with
Excel.Visible := True;
except
Excel.Quit;
end;
finally
Screen.Cursor := crDefault;
end;
end;
//Формирование акта сдачи-приемки:
procedure Rep_Act;
var
WorkbookName: string;
Excel: Variant;
i, PosInc: Integer;
Sum: Currency;
begin
//Шаблон хранится в папке Шаблоны:
WorkbookName := GetCurrentDir + '\Templates\' + 'Акт.xlt';
Excel := CreateOleObject('Excel.Application');
Screen.Cursor := crHourGlass;
try
try
Excel.Workbooks.Open(WorkbookName);
//Экспорт данных из таблицы БД:
with DM do
begin
i := 0;
PosInc := 14;
//Вывод реквизитов в шапку:
DM.tbInfo.Open;
Excel.Cells[1,1] := DM.tbInfo.FieldByName('Наименование').AsString;
Excel.Cells[2,1] := DM.tbInfo.FieldByName('Адрес').AsString;
Excel.Cells[3,1] := 'ИНН ' + DM.tbInfo.FieldByName('ИНН').AsString +
', КПП ' + DM.tbInfo.FieldByName('КПП').AsString;
Excel.Cells[7,2] := DM.tbInfo.FieldByName('Наименование').AsString;
DM.tbInfo.Close;
Excel.Cells[8,2] := dstOrders.FieldByName('Клиент').AsString;
Excel.Cells[9,2] := dstOrders.FieldByName('Клиент').AsString;
Excel.Cells[5,3] := FormatFloat('0000', dstOrders.FieldByName('NЗаказа').AsInteger) +
' от ' + GetRightDate(DM.dstOrders.FieldByName('ДатаСдачи').AsDateTime);
//Цикл по работам:
dstJobs.First;
Sum := 0; //Сумма работ
while not dstJobs.Eof do
begin
//Добавление новой строки для продукции:
if i <> 0 then
begin
Excel.Rows.Item[PosInc+i].Select;
Excel.Selection.Insert;
Excel.Rows.Item[PosInc].Select;
Excel.Selection.Copy;
Excel.Rows.Item[PosInc+i].Select;
Excel.ActiveSheet.Paste;
Excel.Application.CutCopyMode := False;
end;
Excel.Cells[i+PosInc,1] := i+1;
Excel.Cells[i+PosInc,2] := dstJobs.FieldByName('Работа').AsString;
Excel.Cells[i+PosInc,3] := dstJobs.FieldByName('Стоимость').AsCurrency;
Excel.Cells[i+PosInc,4] := FormatFloat('0,00', dstJobs.FieldByName('Количество').AsFloat);
Excel.Cells[i+PosInc,5] := dstJobs.FieldByName('Сумма').AsCurrency;
Inc(i);
Sum := Sum + dstJobs.FieldByName('Сумма').AsCurrency;
dstJobs.Next;
end; //while not dstJobs.Eof
Excel.Cells[i+PosInc,5] := Sum;
Excel.Cells[i+PosInc+1,5] := Sum/118*18;
end; //with
Excel.Visible := True;
except
Excel.Quit;
end;
finally
Screen.Cursor := crDefault;
end;
end;
//Формирование счета:
procedure Rep_Bill;
var
WorkbookName: string;
Excel: Variant;
i, PosInc: Integer;
Sum: Currency;
begin
//Шаблон хранится в папке Шаблоны:
WorkbookName := GetCurrentDir + '\Templates\' + 'Счет.xlt';
Excel := CreateOleObject('Excel.Application');
Screen.Cursor := crHourGlass;
try
try
Excel.Workbooks.Open(WorkbookName);
//Экспорт данных из таблицы БД:
with DM do
begin
i := 0;
PosInc := 9;
Excel.Cells[4,2] := FormatFloat('0000', dstOrders.FieldByName('NЗаказа').AsInteger) +
' от ' + dstOrders.FieldByName('ДатаПриема').AsString;
Excel.Cells[6,2] := dstOrders.FieldByName('Клиент').AsString + ', ИНН ' +
DM.tbOrgs.FieldByName('ИНН').AsString + ', КПП ' +
DM.tbOrgs.FieldByName('КПП').AsString;
//Цикл по работам:
dstJobs.First;
Sum := 0;
while not dstJobs.Eof do
begin
//Добавление новой строки для работы:
if i <> 0 then
begin
Excel.Rows.Item[PosInc+i].Select;
Excel.Selection.Insert;
Excel.Rows.Item[PosInc].Select;
Excel.Selection.Copy;
Excel.Rows.Item[PosInc+i].Select;
Excel.ActiveSheet.Paste;
Excel.Application.CutCopyMode := False;
end;
Excel.Cells[i+PosInc,1] := i+1;
Excel.Cells[i+PosInc,2] := dstJobs.FieldByName('Работа').AsString;
Excel.Cells[i+PosInc,3] := 'шт';
Excel.Cells[i+PosInc,4] := dstJobs.FieldByName('Количество').AsFloat;
Excel.Cells[i+PosInc,5] := dstJobs.FieldByName('Стоимость').AsCurrency;
Excel.Cells[i+PosInc,6] := dstJobs.FieldByName('Сумма').AsCurrency;
Inc(i);
Sum := Sum + dstJobs.FieldByName('Сумма').AsCurrency;
dstJobs.Next;
end; //while not dstJobs.Eof
//Цикл по МТР:
dstOrderParts.First;
while not dstOrderParts.Eof do
begin
//Добавление новой строки для МТР:
if i <> 0 then
begin
Excel.Rows.Item[PosInc+i].Select;
Excel.Selection.Insert;
Excel.Rows.Item[PosInc].Select;
Excel.Selection.Copy;
Excel.Rows.Item[PosInc+i].Select;
Excel.ActiveSheet.Paste;
Excel.Application.CutCopyMode := False;
end;
Excel.Cells[i+PosInc,1] := i+1;
Excel.Cells[i+PosInc,2] := dstOrderParts.FieldByName('Материал').AsString;
Excel.Cells[i+PosInc,3] := tbParts.FieldByName('ЕдИзм').AsString;
Excel.Cells[i+PosInc,4] := dstOrderParts.FieldByName('Количество').AsFloat;
Excel.Cells[i+PosInc,5] := dstOrderParts.FieldByName('Цена').AsCurrency;
Excel.Cells[i+PosInc,6] := dstOrderParts.FieldByName('Сумма').AsCurrency;
Inc(i);
Sum := Sum + dstOrderParts.FieldByName('Сумма').AsCurrency;
dstOrderParts.Next;
end; //while not dstJobs.Eof
Excel.Cells[i+PosInc,6] := Sum;
Excel.Cells[i+PosInc+1,6] := Sum/118*18;
Excel.Cells[i+PosInc+3,2] := SumToTxt(Format('%.2f', [Sum]));
//Вывод реквизитов в шапку:
DM.tbInfo.Open;
Excel.Cells[1,1] := DM.tbInfo.FieldByName('Наименование').AsString + ', ' +
DM.tbInfo.FieldByName('Адрес').AsString + ', ИНН ' +
DM.tbInfo.FieldByName('ИНН').AsString + ', КПП ' +
DM.tbInfo.FieldByName('КПП').AsString;
Excel.Cells[2,1] := DM.tbInfo.FieldByName('Реквизиты').AsString;
Excel.Cells[i+PosInc+5,3] := DM.tbInfo.FieldByName('ГенДиректор').AsString;
DM.tbInfo.Close;
end; //with
Excel.Visible := True;
except
Excel.Quit;
end;
finally
Screen.Cursor := crDefault;
end;
end;
//Формирование счета-фактуры:
procedure Rep_Fact;
var
WorkbookName: string;
Excel: Variant;
i, PosInc: Integer;
Sum: Currency;
begin
//Шаблон хранится в папке Шаблоны:
WorkbookName := GetCurrentDir + '\Templates\' + 'Счет-фактура.xlt';
Excel := CreateOleObject('Excel.Application');
Screen.Cursor := crHourGlass;
try
try
Excel.Workbooks.Open(WorkbookName);
//Экспорт данных из таблицы БД:
with DM do
begin
i := 0;
PosInc := 19;
Excel.Cells[4,2] := FormatFloat('0000', dstOrders.FieldByName('NЗаказа').AsInteger);
Excel.Cells[4,4] := GetRightDate(DM.dstOrders.FieldByName('ДатаПриема').AsDateTime);
Excel.Cells[10,2] := dstOrders.FieldByName('Клиент').AsString + ', ' +
DM.tbOrgs.FieldByName('Адрес').AsString;
Excel.Cells[11,2] := 'С' + FormatFloat('0000', dstOrders.FieldByName('NЗаказа').AsInteger) +
' от ' + dstOrders.FieldByName('ДатаПриема').AsString;
Excel.Cells[12,2] := dstOrders.FieldByName('Клиент').AsString;
Excel.Cells[13,2] := DM.tbOrgs.FieldByName('Адрес').AsString;
Excel.Cells[14,2] := DM.tbOrgs.FieldByName('ИНН').AsString + ' / ' +
DM.tbOrgs.FieldByName('КПП').AsString;
//Цикл по работам:
dstJobs.First;
Sum := 0;
while not dstJobs.Eof do
begin
//Добавление новой строки для работы:
if i <> 0 then
begin
Excel.Rows.Item[PosInc+i].Select;
Excel.Selection.Insert;
Excel.Rows.Item[PosInc].Select;
Excel.Selection.Copy;
Excel.Rows.Item[PosInc+i].Select;
Excel.ActiveSheet.Paste;
Excel.Application.CutCopyMode := False;
end;
Excel.Cells[i+PosInc,1] := dstJobs.FieldByName('Работа').AsString;
Excel.Cells[i+PosInc,2] := 'шт';
Excel.Cells[i+PosInc,3] := dstJobs.FieldByName('Количество').AsFloat;
Excel.Cells[i+PosInc,4] := dstJobs.FieldByName('Стоимость').AsCurrency;
Excel.Cells[i+PosInc,5] := dstJobs.FieldByName('Сумма').AsCurrency / 118 * 100;
Excel.Cells[i+PosInc,8] := dstJobs.FieldByName('Сумма').AsCurrency / 118 * 18;
Excel.Cells[i+PosInc,9] := dstJobs.FieldByName('Сумма').AsCurrency;
Inc(i);
Sum := Sum + dstJobs.FieldByName('Сумма').AsCurrency;
dstJobs.Next;
end; //while not dstJobs.Eof
//Цикл по МТР:
dstOrderParts.First;
while not dstOrderParts.Eof do
begin
//Добавление новой строки для продукции:
if i <> 0 then
begin
Excel.Rows.Item[PosInc+i].Select;
Excel.Selection.Insert;
Excel.Rows.Item[PosInc].Select;
Excel.Selection.Copy;
Excel.Rows.Item[PosInc+i].Select;
Excel.ActiveSheet.Paste;
Excel.Application.CutCopyMode := False;
end;
Excel.Cells[i+PosInc,1] := dstOrderParts.FieldByName('Материал').AsString;
Excel.Cells[i+PosInc,4] := tbParts.FieldByName('ЕдИзм').AsString;
Excel.Cells[i+PosInc,3] := dstOrderParts.FieldByName('Количество').AsFloat;
Excel.Cells[i+PosInc,4] := dstOrderParts.FieldByName('Цена').AsCurrency / 118 * 100;
Excel.Cells[i+PosInc,5] := dstOrderParts.FieldByName('Сумма').AsCurrency / 118 * 100;
Excel.Cells[i+PosInc,8] := dstOrderParts.FieldByName('Сумма').AsCurrency / 118 * 18;
Excel.Cells[i+PosInc,9] := dstOrderParts.FieldByName('Сумма').AsCurrency;
Inc(i);
Sum := Sum + dstOrderParts.FieldByName('Сумма').AsCurrency;
dstOrderParts.Next;
end; //while not dstJobs.Eof
Excel.Cells[i+PosInc,9] := Sum / 118 * 18;
Excel.Cells[i+PosInc,9] := Sum;
//Вывод реквизитов:
DM.tbInfo.Open;
Excel.Cells[6,2] := DM.tbInfo.FieldByName('Наименование').AsString;
Excel.Cells[7,2] := DM.tbInfo.FieldByName('Адрес').AsString;
Excel.Cells[8,2] := DM.tbInfo.FieldByName('ИНН').AsString + ' / ' +
DM.tbInfo.FieldByName('КПП').AsString;
Excel.Cells[9,3] := DM.tbInfo.FieldByName('Наименование').AsString +
', ' + DM.tbInfo.FieldByName('Адрес').AsString;
Excel.Cells[i+PosInc+3,4] := DM.tbInfo.FieldByName('ГенДиректор').AsString;
Excel.Cells[i+PosInc+3,10] := DM.tbInfo.FieldByName('ГлавБух').AsString;
DM.tbInfo.Close;
end; //with
Excel.Visible := True;
except
Excel.Quit;
end;
finally
Screen.Cursor := crDefault;
end;
end;
//Функция возвращает дату формата "xx месяца xxxx г."
function GetRightDate(ADate: TDateTime): string;
var
Month: string;
begin
case MonthOf(ADate) of
1: Month := 'января';
2: Month := 'февраля';
3: Month := 'марта';
4: Month := 'апреля';
5: Month := 'мая';
6: Month := 'июня';
7: Month := 'июля';
8: Month := 'августа';
9: Month := 'сентября';
10: Month := 'октября';
11: Month := 'ноября';
12: Month := 'декабря';
end;
Result := FormatDateTime('dd ' + Month + ' yyyy г.', ADate);
end;
//Открытие пустого бланка дефектной ведомости:
procedure Rep_Defect;
var
ObjWord: Variant;
begin
ObjWord := CreateOleObject('Word.Application');
Screen.Cursor := crHourGlass;
try
try
ObjWord.Documents.Open(GetCurrentDir + '\Templates\Дефектная ведомость.dot');
ObjWord.Visible := True;
except
ObjWord.Quit;
end;
finally
Screen.Cursor := crDefault;
end;
end;
end.
unit uStatistics;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, Buttons, DBCtrls, ExtCtrls, TeEngine,
Series, TeeProcs, Chart, DbChart, TeePrevi;
type
TfmStatistics = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
DBChart2: TDBChart;
TabSheet3: TTabSheet;
DBChart3: TDBChart;
HorizBarSeries1: TBarSeries;
LineSeries1: TBarSeries;
TabSheet4: TTabSheet;
DBChart4: TDBChart;
PieSeries2: TPieSeries;
Panel3: TPanel;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
SpeedButton4: TSpeedButton;
Label1: TLabel;
dtpDate1: TDateTimePicker;
Label2: TLabel;
dtpDate2: TDateTimePicker;
BitBtn2: TBitBtn;
bbtExit: TBitBtn;
DBChart1: TDBChart;
PieSeries1: TPieSeries;
procedure dtpDate1Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure bbtExitClick(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton4Click(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmStatistics: TfmStatistics;
implementation
uses uDM, uRep;
{$R *.dfm}
procedure TfmStatistics.dtpDate1Change(Sender: TObject);
begin
//В зависимости от активной закладки запускается обработчик соответствующей кнопки:
case PageControl1.ActivePageIndex of
0: SpeedButton1Click(Self);
1: SpeedButton2Click(Self);
2: SpeedButton3Click(Self);
3: SpeedButton4Click(Self);
end;
end;
procedure TfmStatistics.FormCreate(Sender: TObject);
begin
dtpDate1.Date := Date;
dtpDate2.Date := Date;
SpeedButton1.Caption := 'Потребность в МТР' + Chr(13) + 'за период';
SpeedButton2.Caption := 'Статистика расхода МТР за период';
SpeedButton4.Caption := 'Суммы работ по' + Chr(13) + 'клиентам за период';
SpeedButton1.Down := True;
SpeedButton1Click(Self);
end;
procedure TfmStatistics.BitBtn2Click(Sender: TObject);
begin
//В зависимости от активной закладки выводится в режим просмотра перед печатью
//выбранная диаграмма:
if PageControl1.ActivePageIndex = 0 then
ChartPreview(Self, DBChart1)
else if PageControl1.ActivePageIndex = 1 then
ChartPreview(Self, DBChart2)
else if PageControl1.ActivePageIndex = 2 then
ChartPreview(Self, DBChart3)
else if PageControl1.ActivePageIndex = 3 then
ChartPreview(Self, DBChart4);
end;
procedure TfmStatistics.bbtExitClick(Sender: TObject);
begin
Close;
end;
//Формирование диаграммы "Потребность МТР за период":
procedure TfmStatistics.SpeedButton1Click(Sender: TObject);
begin
PageControl1.ActivePageIndex := 0;
DM.dstStatPartsCateg.Close;
DM.dstStatPartsCateg.Parameters.ParamByName('pDate1').Value := dtpDate1.Date;
DM.dstStatPartsCateg.Parameters.ParamByName('pDate2').Value := dtpDate2.Date;
DM.dstStatPartsCateg.Parameters.ParamByName('pDate11').Value := dtpDate1.Date;
DM.dstStatPartsCateg.Parameters.ParamByName('pDate22').Value := dtpDate2.Date;
DM.dstStatPartsCateg.Open;
DBChart1.Title.Text.Strings[0] := 'Потребность в МТР c ' +
DateToStr(dtpDate1.Date) + ' по ' + DateToStr(dtpDate2.Date);
end;
//Формирование диаграммы "Статистика расхода МТР за период":
procedure TfmStatistics.SpeedButton2Click(Sender: TObject);
begin
PageControl1.ActivePageIndex := 1;
DM.dstStatPartsSum.Close;
DM.dstStatPartsSum.Parameters.ParamByName('pDate1').Value := dtpDate1.Date;
DM.dstStatPartsSum.Parameters.ParamByName('pDate2').Value := dtpDate2.Date;
DM.dstStatPartsSum.Open;
DBChart2.Title.Text.Strings[0] := 'Статистика расхода МТР c ' +
DateToStr(dtpDate1.Date) + ' по ' + DateToStr(dtpDate2.Date);
end;
//Формирование диаграммы "Суммы работ за период":
procedure TfmStatistics.SpeedButton3Click(Sender: TObject);
begin
PageControl1.ActivePageIndex := 2;
DM.dstStatOrderSum.Close;
DM.dstStatOrderSum.Parameters.ParamByName('pDate1').Value := dtpDate1.Date;
DM.dstStatOrderSum.Parameters.ParamByName('pDate2').Value := dtpDate2.Date;
DM.dstStatOrderSum.Parameters.ParamByName('pDate11').Value := dtpDate1.Date;
DM.dstStatOrderSum.Parameters.ParamByName('pDate22').Value := dtpDate2.Date;
DM.dstStatOrderSum.Open;
DBChart3.Title.Text.Strings[0] := 'Суммы работ c ' +
DateToStr(dtpDate1.Date) + ' по ' + DateToStr(dtpDate2.Date);
end;
//Формирование диаграммы "Суммы работ по клиентам за период":
procedure TfmStatistics.SpeedButton4Click(Sender: TObject);
begin
PageControl1.ActivePageIndex := 3;
DM.dstStatClientSum.Close;
DM.dstStatClientSum.Parameters.ParamByName('pDate1').Value := dtpDate1.Date;
DM.dstStatClientSum.Parameters.ParamByName('pDate2').Value := dtpDate2.Date;
DM.dstStatClientSum.Parameters.ParamByName('pDate11').Value := dtpDate1.Date;
DM.dstStatClientSum.Parameters.ParamByName('pDate22').Value := dtpDate2.Date;
DM.dstStatClientSum.Open;
DBChart4.Title.Text.Strings[0] := 'Суммы работ по клиентам c ' +
DateToStr(dtpDate1.Date) + ' по ' + DateToStr(dtpDate2.Date);
end;
end.
unit uStr;
//Модуль для перевода числового представления суммы в строковое
interface
uses
SysUtils, StrUtils;
function SumToTxt(Value: String) : string; //Функция для перевода (аргумент - строка, содержащая сумму)
implementation
const a:array[0..8,0..9] of string=(
('','один ','два ','три ','четыре ','пять ','шесть ','семь ','восемь ','девять '),
('','','двадцать ','тридцать ','сорок ','пятьдесят ','шестьдесят ','семьдесят ','восемьдесят ','девяносто '),
('','сто ','двести ','триста ','четыреста ','пятьсот ','шестьсот ','семьсот ','восемьсот ','девятьсот '),
('тысяч ','тысяча ','две тысячи ','три тысячи ','четыре тысячи ','пять тысяч ','шесть тысяч ','семь тысяч ',
'восемь тысяч ','девять тысяч '),
('','','двадцать ','тридцать ','сорок ','пятьдесят ','шестьдесят ','семьдесят ','восемьдесят ','девяносто '),
('','сто ','двести ','триста ','четыреста ','пятьсот ','шестьсот ','семьсот ','восемьсот ','девятьсот '),
('миллионов ','один миллион ','два миллиона ','три миллиона ','четыре миллиона ','пять миллионов ',
'шесть миллионов ','семь миллионов ','восемь миллионов ','девять миллионов '),
('','','двадцать ','тридцать ','сорок ','пятьдесят ','шестьдесят ','семьдесят ','восемьдесят ','девяносто '),
('','сто ','двести ','триста ','четыреста ','пятьсот ','шестьсот ','семьсот ','восемьсот ','девятьсот '));
b:array[0..9] of string=
('десять ','одинадцать ','двенадцать ','тринадцать ','четырнадцать ','пятьнадцать ','шестьнадцать ',
'семьнадцать ','восемьнадцать ','девятьнадцать ');
function SumToStrin(Value : String) : string;
var s,t:string;
p,pp,i,k:integer;
begin
s:=value;
if s='0' then
t:='Ноль '
else begin
p:=length(s);
pp:=p;
if p>1 then
if (s[p-1]='1') and (s[p]>'0') then begin
t:=b[strtoint(s[p])];
pp:=pp-2;
end;
i:=pp;
while i>0 do begin
if (i=p-3) and (p>4) then
if s[p-4]='1' then begin
t:=b[strtoint(s[p-3])]+'тысяч '+t;
i:=i-2;
end;
if (i=p-6) and (p>7) then
if s[p-7]='1' then begin
t:=b[strtoint(s[p-6])]+'миллионов '+t;
i:=i-2;
end;
if i>0 then begin
k:=strtoint(s[i]);
t:=a[p-i,k]+t;
i:=i-1;
end;
end;
end;
Result := t;
end;
//Разделяет сумму на рубли и копейки:
procedure get2str(value:string;var hi,lo:string);
var p:integer;
begin
p:=pos(',',value);
lo:='';hi:='';
if p=0 then
p:=pos('.',value);
if p<>0 then
delete(value,p,1);
if p=0 then begin
hi:=value;
lo:='00';
end;
if p>length(value) then begin
hi:=value;
lo:='00';
end;
if p=1 then begin
hi:='0';
lo:=value;
end;
if (p>1) and (p<length(value)) then begin
hi:=copy(value,1,p-1);
lo:=copy(value,p,length(value));
end;
end;
function SumToTxt(value: string):string;
var hi,lo:string;
pr,er:integer;
begin
get2str(value,hi,lo);
if (hi='') or (lo='') then begin
result:='';exit;
end;
val(hi,pr,er);if er<>0 then begin
result:='';
exit;
end;
hi:=sumtostrin(inttostr(pr))+'руб. ';
if lo<>'00' then begin
val(lo,pr,er);
if er<>0 then begin
result:='';
exit;
end;
lo:=inttostr(pr);
end;
lo:=lo+' коп. ';
hi[1]:=AnsiUpperCase(hi[1])[1];
result:=hi+lo;
end;
end.