ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ ФИЛИАЛ _________________________________________________ КАФЕДРА№ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ И СИСТЕМ В ЭКОНОМИКЕ. КУРСОВАЯ РАБОТА ПО ДИСЦИПЛИНЕ «Программирование на языке высокого уровня» ТЕМА: «Создание отчета MS Excel о прибыли фирмы «Бест-Фото» на основе базы данных MS Access» Студент: Группа: Преподаватель: _________________ 2012г. ______ ________ ____________ Организация предметной области. Целью данной курсовой работы является создание алгоритма формирования экономического отчета MS Excel на основе входных параметров и информации о функционировании фирмы «Бест-Фото», в дальнейшем именуюемой ФирмойF, в базе данных MS Access. Наша ФирмойF занимается цветной печатью на различных форматах и типах бумаги и попутно оказывает услуги, связанные с фотографией. Существует система накопительных скидок на услуги печати и отдельные услуги. Процентная ставка по карте меняется с течением времени, как и сама стоимость карты. Есть 3 статуса дисконтной карты: «Bronze», «Silver» и «Gold». Этот статус зависит от суммы всех заказов сделанных владельцем карты. После покупки дисконтной карты клиент имеет право на получение скидки 3%. Когда общая сумма заказов клиента превышает 5000р., карта получает статус «Bronze», далее идет 10000р. – «Silver» и 15000р. – «Gold». Стоит отметить, что все процентные ставки могут изменяться с течением времени, причем отдельно на печать и отдельно на услуги. Фирма работает с несколькими поставщиками фотобумаги, при этом ее заказ ложится на менеджера фирмы, который в свою очередь связывается с менеджером по оптовым продажам какого-либо поставщика и делает заказ необходимых материалов. Бумага которую использует наша Фирма-X, как и в прочем вся бумага для печати, делится по таким признакам как Формат, Тип и Плотность. Заказ осуществляется пачками, которые в свою очередь различаются количеством листов бумаги в них. Прием этой бумаги осуществляет менеджер фирмы. В зависимости от закупочной цены и других экономических факторов менеджер выставляет цену на услугу печати конкретного формата (за один оттиск) и сопутствующие услуги. Сотрудник занимающийся оформлением заказов составляет список, сколько и какого формата нужно печатать и необходимые услуги, оформляет заказ и клиент производит полную оплату. Заказ передают оператору, 2 выполняющему их, который в свою очередь, выполнив его, делает об этом отметку и отдает выполненный заказ обратно. Эта информация является, своего рода, описанием системы функционирования и работы нашей фирмы. В курсовой работе используется реляционная база данных Microsoft Access 2003, созданная в ходе выполнения курсовой работы по дисциплине «Базы Данных». Она позволяет хранить данные, которые являются результатом работы нашей ФирмыF. Она хранит данные обо всех оказанных услугах, клиентах, дисконтных картах, данные склада бумаги, остатки, стоимости и поступления, набор оказываемых услуг, их описание и цены. Для создания экономического отчета о прибыли фирмы за период времени ее функционирования были разработаны модули Unit1 (Модуль и ‘кранная форма) и MUser (Модуль с универсальными вспомогательными функциями и процедурами). Модуль Muser содержит: Function UsrRnd(m,n:integer):integer; Функция генерирует натуральное число в диапазоне от М до N, M<N. Например: -99..66, Function NN(ColumnAA: String): Integer; Function AA(ColumnNN: Integer): String; Функции для работы с адресацией ячеек Excel, перевод адресов из символьного значения в числовой и наоборот, Function GetMonthNumber(Month: String): Integer; Функция возвращает номер месяца по полномону нозванию, Function GetDaysInMonth(MonthYear: TDateTime): Integer; Функция возвращает количество дней в месяце. Модуль Unit1 имеет экранную форму Main: 3 С помощью элементво формы задаются параметры для формирования отчета. Пользователь имеет возможность выбрать период, за который нужно сформировать отчет: Год; Год и месяц; Интервал с произвольными датами. Для работы с MS Excel используется технология Object Linking and Embedding (OLE, с 1996г - ActiveX) связывания и внедрения одних объектов в другие документы и объекты, разработанная корпорацией Майкрософт. Автоматизация позволяет одному приложению управлять другим приложением. Управляемое приложение называется сервером автоматизации (в нашем случае Excel). Приложение, управляющее сервером называется диспетчером автоматизации. Есть два пути для получения доступа к серверам автоматизации: Позднее связывание (Интерфейс IDispatch) При использовании данного метода имена функций и типы параметров решаются во время выполнения программы, все параметры определены вариантным типом. Поскольку во время компиляции невозможно определить соответствия имен функций и типов параметров, данный метод чреват ошибками. Так как имена функций и типы параметров должны проверяться во время выполнения программы, данный метод выполняется медленно. Единственное преимущество данного метода при программировании в Delphi заключается в том, что отпадает необходимость передачи всех параметров вызываемой функции. 4 Раннее связывание (Использование библиотеки типов/интерфейсов) При использовании данного метода имена функций и типы параметров полностью решаются во время компиляции. Библиотека типов должна импортироваться в Delphi. Библиотека типов является языковым нейтральным описанием всех объектов и функций, поддерживаемых сервером. При вызове функции должны обязательно присутствовать все параметры, даже те, которые в документации указаны как дополнительные (необязательные). Это позволяет обнаружить и исправить множество ошибок еще до запуска программы. Скорость выполнения значительно быстрее, чем при использовании позднего связывания. Из-за преимуществ второго метода остальная часть документа демонстрирует принципы создания приложений с ранним связыванием. Все приложения, использующие Excel автоматизацию, должны пользоваться последним методом, если нет причин для первого. В нашей программе мы будем использовать «Позднее связывание» так как во время компиляции невозможно определить соответствия имен функций и типов параметров. Чтобы вызвать эту форму и сформировать отчет пользователь должен Вызвать процедуру нажатия на Кнопку [Отчеты] >> [Прибыль за период] меню MainMenu формы Main, выбрать промежуток времени и нажать кнопку [Сформировать]. 5 После нажатия этой кнопки появляется окно с просьбой подождать, пока формируется отчет. Пользователь может отредактировать сформированный отчет и сохранить в нужное ему место на жестком или др. диске. 6 Программа работает с шаблоном документа, который имеет атрибуты [Скрытый][Системный][ТолькоЧтение], находящимся в директории [Шаблоны], поэтому для того, чтобы сохранить его, необходимо выбрать директорию для сохранения и имя файла. В верхней части отчета выводится основная информация о фирме, дата/время когда был сформирован отчет и на какой промежуток времени. 7 8 Блок-схема процедуры нажатия кнопки формирования отчета. 9 10 11 Код программы program Project1; uses Forms, Unit1 in 'Unit1.pas' {Main}, MUser in 'MUser.pas', Unit2 in 'Unit2.pas' {Form2}; {$R *.res} begin Application.Initialize; Application.CreateForm(TMain, Main); Application.CreateForm(TForm2, Form2); Main.Position:=poScreenCenter; Form2.Position:=poScreenCenter; Application.Run; end. //============================================================================== unit MUser; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Dialogs, Grids, StdCtrls, Buttons, Types, QForms; // Функция генерирующая натуральное число в диапазоне // от М до N, M<N. Например: -99..66 . function UsrRnd(m,n:integer):integer; //работа с Excel, перевод адресов столбцов function NN(ColumnAA: String):Integer; function AA(ColumnNN: Integer):String; //номер месяца по полн назв месяца Function GetMonthNumber(Month: String): Integer; Function GetDaysInMonth(MonthYear: TDateTime): Integer; //var ; implementation uses DateUtils; //-----------------------------------------------------------------------------function UsrRnd(m,n:integer):integer; var x:integer; begin // Функция генерирующая натуральное число в диапазоне // от М до N, M<N. Например: [-99..66] [-444..-222] [33..99] . Randomize; UsrRnd:=0; if (m<n)and(m<0)and(n>0) then begin x:=abs(m)+n; UsrRnd:=random(x+1)-abs(m); end; if (m<n)and(m>0)and(n>0) then begin x:=n-m; 13 UsrRnd:=random(x+1)+m; end; if (m<n)and(m<0)and(n<0) then begin x:=abs(m)-abs(n); UsrRnd:=(random(x+1)+abs(n))*(-1); end; end; //-----------------------------------------------------------------------------function NN(ColumnAA: String):Integer; var StrLen: Byte; N1,N2: Integer; begin try StrLen := Length(ColumnAA); // a 65 26 if StrLen=1 then begin NN := Ord(ColumnAA[1])-64; end else if StrLen=2 then begin N1 := Ord(ColumnAA[2])-64; N2 := (Ord(ColumnAA[1])-64)*26; NN := N1 + N2; end else if (StrLen=0) or (StrLen>2) then NN:=0; except NN:=0; end; end; //-----------------------------------------------------------------------------function AA(ColumnNN: Integer):String; var C1,C2: Char; begin try if (ColumnNN<=26) and (ColumnNN>=1) then begin AA := Chr(ColumnNN+64); end else if (ColumnNN>=27) then begin C1 := Chr((ColumnNN) div 26 +64); C2 := Chr((ColumnNN) mod 26 +64); AA:=C1+C2; end else AA:=''; except AA:=''; end; end; //-----------------------------------------------------------------------------Function GetMonthNumber(Month: String): Integer; Begin For Result := 1 to 12 do If Month = LongMonthNames[Result] Then Exit; Result := 0; End; //-----------------------------------------------------------------------------Function GetDaysInMonth(MonthYear: TDateTime): Integer; var Month,Year:Integer; 14 Begin Month := MonthOf (MonthYear); Year := YearOf (MonthYear); Case Month of 1,3,5,7,8,10,12: Result := 31; 4,6,9,11: Result := 30; 2: if (Year mod 4= 0) and (Year mod 100 <> 0) or (Year mod 400=0) then Result := 29 else Result := 28 else Result := 0; end End; //-----------------------------------------------------------------------------end. //============================================================================== unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls, ComCtrls, DBCtrls, Buttons, ComObj, Excel_TLB, XPMan; type TMain = class(TForm) ADOConnection1: TADOConnection; ADOTableZakazi: TADOTable; DataSource1: TDataSource; DataSource2: TDataSource; ADOTablePechat: TADOTable; ADOStoredProc1: TADOStoredProc; DataSource3: TDataSource; PageControl1: TPageControl; Label1: TLabel; Label2: TLabel; TabSheet1: TTabSheet; DBGrid2: TDBGrid; Edit5: TEdit; Edit3: TEdit; Edit4: TEdit; DBGrid1: TDBGrid; Edit1: TEdit; Edit2: TEdit; EditKolZak: TEdit; EditDate: TEdit; Button1: TButton; DataSource4: TDataSource; TabSheet2: TTabSheet; ADOTable1: TADOTable; ADOStoredProc2: TADOStoredProc; DataSource5: TDataSource; ADOStoredProc2DSDesigner: TSmallintField; ADOStoredProc2DSDesigner2: TSmallintField; ADOStoredProc2Field: TStringField; GroupBox2: TGroupBox; DateTimePicker1: TDateTimePicker; DateTimePicker2: TDateTimePicker; 15 GroupBox1: TGroupBox; CheckBox1: TCheckBox; GroupBox5: TGroupBox; RadioButton1: TRadioButton; RadioButton2: TRadioButton; ComboBox1: TComboBox; ComboBox2: TComboBox; ADOTable1DSDesigner: TSmallintField; BitBtn1: TBitBtn; ADOStoredProc1DSDesigner: TAutoIncField; ADOStoredProc1DSDesigner2: TWideStringField; ADOStoredProc1DSDesigner3: TWideStringField; ADOStoredProc1DSDesigner4: TWideStringField; ADOStoredProc1Sum: TFloatField; ADOStoredProc1DSDesigner5: TFloatField; ADOStoredProc1DSDesigner6: TFloatField; ADOStoredProc1Avg: TFloatField; ADOStoredProc1Avg2: TBCDField; ADOStoredProc1DSDesigner8: TBCDField; ADOStoredProc1DSDesigner9: TFloatField; ADOStoredProc1DSDesigner7: TBCDField; Label4: TLabel; BitBtn2: TBitBtn; XPManifest1: TXPManifest; DataSource6: TDataSource; ADOStoredProcOutp: TADOStoredProc; ADOStoredProcOst: TADOStoredProc; DataSource7: TDataSource; ADOStoredProcPost: TADOStoredProc; DataSource8: TDataSource; ADOStoredProcPostKB: TAutoIncField; ADOStoredProcPostDSDesigner2: TAutoIncField; ADOStoredProcPostDSDesigner3: TIntegerField; ADOStoredProcPostDSDesigner4: TWideStringField; ADOStoredProcPostDSDesigner5: TFloatField; ADOStoredProcPostListov: TFloatField; ADOStoredProcPostDSDesigner7: TBCDField; ADOStoredProcPostSebestL: TFloatField; ADOStoredProcPostDSDesigner9: TDateTimeField; BitBtn3: TBitBtn; ADOStoredProcOstKB: TAutoIncField; ADOStoredProcOstOst: TFloatField; ADOStoredProcOutpDSDesigner: TAutoIncField; ADOStoredProcOutpOutp: TFloatField; ADOStoredProcOutpAvg: TBCDField; ADOStoredProcOutpLast: TDateTimeField; ADOTablePechSrCena: TADOTable; ADOTablePechSrCenaKB: TIntegerField; ADOTablePechSrCenaListov: TIntegerField; ADOTablePechSrCenaSrCenaList: TBCDField; Label3: TLabel; Label5: TLabel; procedure KolPechatiSrCenaNaPeriod(KodBumagi: Integer); procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ADOStoredProc2CalcFields(DataSet: TDataSet); procedure RadioButton1Click(Sender: TObject); procedure RadioButton2Click(Sender: TObject); procedure CheckBox1Click(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject); procedure ComboBox1Change(Sender: TObject); procedure ComboBox1Click(Sender: TObject); private { Private declarations } public 16 { Public declarations } end; const Month: Array [1..12] of String = ('Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'); AAA: Array [1..26] of Char = ('A','B','C','D','E','F','G','H','I','J','K','L', 'M','N','O','P','Q','R','S','T','U','V','W','X', 'Y','Z'); var Main: TMain; xnow: TDateTime; MsExcel: Variant; CurYearItInd: Byte; implementation uses MUser, Math, DateUtils, Unit2; {$R *.dfm} //-----------------------------------------------------------------------------procedure TMain.Button1Click(Sender: TObject); var kol_poz, kod_kl, prinyal, kol, vipolnil, kod_prais, n_zak, kol_zak_den, i, j: integer; begin kol_zak_den :=UsrRnd(1,10); EditKolZak.Text:=IntToStr(kol_zak_den); EditDate.Text:=DateTimeToStr(xnow); for j:= 1 to kol_zak_den do begin kol_poz :=UsrRnd(1,3); kod_kl :=UsrRnd(3,41); prinyal :=UsrRnd(5,6); kol :=UsrRnd(10,100); vipolnil :=UsrRnd(3,4); kod_prais :=UsrRnd(1,54); ADOTablePechat.Open; ADOTableZakazi.Open; ADOTableZakazi.Append; ADOTableZakazi.FieldByName('N Клиент').AsInteger := kod_kl; ADOTableZakazi.FieldByName('Дата').AsDateTime := xNow; ADOTableZakazi.FieldByName('N Принял').AsInteger := prinyal; ADOTableZakazi.Post; n_zak := ADOTableZakazi.FieldByName('Код Заказа').AsInteger; ADOTableZakazi.Close; for i:=1 to kol_poz do begin ADOTablePechat.Append; ADOTablePechat.FieldByName('N Заказ').AsInteger := n_zak; ADOTablePechat.FieldByName('Количество').AsInteger := kol; ADOTablePechat.FieldByName('N Выполнил').AsInteger := vipolnil; ADOTablePechat.FieldByName('Код по прайсу').AsInteger := kod_prais; ADOTablePechat.FieldByName('Выполнено').AsBoolean := True; ADOTablePechat.Post; end; ADOTablePechat.Close; end; Xnow:=Xnow-1; end; //-----------------------------------------------------------------------------procedure TMain.FormCreate(Sender: TObject); begin 17 xnow:=Now; EditDate.Text:=DateTimeToStr(xnow); ADOStoredProc1.Parameters[1].Value:=DateOf(Now); DateTimePicker1.Date:=Now-30; DateTimePicker2.Date:=Now; ADOTable1.Open; ADOTable1.First; while not ADOTable1.Eof do begin ComboBox1.Items.Add(ADOTable1.FieldByName('Годы работы').AsString); ADOTable1.Next; end; ADOTable1.Close; ComboBox1.ItemIndex:=0; ADOStoredProc2.Parameters[0].Value:=ComboBox1.Text; ADOStoredProc2.Open; ADOStoredProc2.Open; ADOStoredProc2.First; while not ADOStoredProc2.Eof do begin ComboBox2.Items.Add(ADOStoredProc2Field.AsString); ADOStoredProc2.Next; end; ADOStoredProc2.Close; ComboBox2.ItemIndex:=0; end; //-----------------------------------------------------------------------------procedure TMain.ADOStoredProc2CalcFields(DataSet: TDataSet); begin ADOStoredProc2Field.AsString:=Month[ ADOStoredProc2DSDesigner2.AsInteger ]; end; //-----------------------------------------------------------------------------procedure TMain.RadioButton1Click(Sender: TObject); begin GroupBox1.Enabled:=True; ComboBox1.Enabled:=True; CheckBox1.Enabled:=True; ComboBox2.Enabled:=True; DateTimePicker1.Enabled:=False; DateTimePicker2.Enabled:=False; GroupBox2.Enabled:=False; end; //-----------------------------------------------------------------------------procedure TMain.RadioButton2Click(Sender: TObject); begin DateTimePicker1.Enabled:=True; DateTimePicker2.Enabled:=True; GroupBox2.Enabled:=True; GroupBox1.Enabled:=False; ComboBox1.Enabled:=False; CheckBox1.Enabled:=False; ComboBox2.Enabled:=False; end; //-----------------------------------------------------------------------------procedure TMain.CheckBox1Click(Sender: TObject); begin if CheckBox1.Checked=True then ComboBox2.Enabled:=True else ComboBox2.Enabled:=False; end; //-----------------------------------------------------------------------------procedure TMain.BitBtn1Click(Sender: TObject); var i,j,n,XRecordCount,XFieldCount,MonthN,Year: integer; 18 Str,FStr: String; DateStart,DateFinish: TDateTime; HeadTbltPos: array of LongWord; begin Main.Enabled:=False; Main.Hide; Form2.Show; try Main.Enabled:=False; MsExcel := CreateOleObject('Excel.Application'); MsExcel.Workbooks.Open[GetCurrentDir()+'\Шаблоны\Отчет маржи.xls']; MsExcel.DisplayAlerts:=False; MsExcel.Range['K1']:=Now; if RadioButton2.Checked then Begin MsExcel.Range['L4']:='на период:'; MsExcel.Range['J5']:='с'; MsExcel.Range['J6']:='по'; MsExcel.Range['K5']:=DateTimePicker1.Date; MsExcel.Range['K6']:=DateTimePicker2.Date; DateStart := StrToDateTime(DateToStr(DateOf(DateTimePicker1.Date))+' 00:00:00'); DateFinish := StrToDateTime(DateToStr(DateOf(DateTimePicker2.Date))+' 23:59:59'); end else if (RadioButton1.Checked) and not(CheckBox1.Checked) then Begin DateStart := StrToDateTime('01.01.'+ComboBox1.Text); DateFinish := StrToDateTime(DateToStr(DateOf(DateStart)+365)+' 23:59:59'); MsExcel.Range['K6'].select; MsExcel.Selection := 'за '+ComboBox1.Text+' г.'; end else Begin MonthN := GetMonthNumber(ComboBox2.Text); Year := StrToInt(ComboBox1.Text); DateStart := StrToDateTime('01.'+IntToStr(MonthN)+'.'+IntToStr(Year)); DateFinish := StrToDateTime( IntToStr(GetDaysInMonth(DateStart)) +'.'+ IntToStr(MonthN) +'.'+ IntToStr(Year) +' 23:59:59' ); MsExcel.Range['K6'].select; MsExcel.Selection := 'за '+Month[MonthN]+' '+ComboBox1.Text+' г.'; end; ADOStoredProc1.Close; ADOStoredProc1.Parameters[0].Value := DateStart; ADOStoredProc1.Parameters[1].Value := DateFinish; ADOStoredProc1.Open; XRecordCount := ADOStoredProc1.RecordCount; XFieldCount := ADOStoredProc1.FieldCount; ADOStoredProc1.First; i:=10; if XRecordCount=0 then ADOStoredProc1.Close else begin while not ADOStoredProc1.Eof do begin if (ADOStoredProc1.RecNo=59) or ((ADOStoredProc1.RecNo-59) mod 68 = 0) then begin SetLength(HeadTbltPos, (Length(HeadTbltPos)+1) ); HeadTbltPos[Length(HeadTbltPos)-1] := ADOStoredProc1.RecNo; MsExcel.Cells[i,1] := 'Код бум.'; MsExcel.Cells[i,2] := 'Формат'; MsExcel.Cells[i,3] := 'Плотн. г/см2'; 19 MsExcel.Cells[i,4] := 'Тип'; MsExcel.Cells[i,5] := 'Средн Себест. лист (р.)'; MsExcel.Cells[i,6] := 'Себест чернил на лист (р.)'; MsExcel.Cells[i,7] := 'Цена реализ. листа (р.)'; MsExcel.Cells[i,8] := 'Кол-во реализ.'; MsExcel.Cells[i,9] := 'Себест. бумаги (р.)'; MsExcel.Cells[i,10] := 'Себест. Чернил (р.)'; MsExcel.Cells[i,11] := 'Оборот (р.)'; MsExcel.Cells[i,12] := 'Маржа (р.)'; MsExcel.Range[AA(1)+IntToStr(i), AA(XFieldCount)+IntToStr(i)].Font.Size := 7; MsExcel.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous; MsExcel.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous; MsExcel.Rows[i].RowHeight := 39; ADOStoredProc1.Next; Inc(i,1); Inc(XRecordCount,1); end; MsExcel.Cells[i,1] := ADOStoredProc1DSDesigner.AsVariant; MsExcel.Cells[i,2] := ADOStoredProc1DSDesigner2.AsVariant; MsExcel.Cells[i,3] := ADOStoredProc1DSDesigner3.AsVariant; MsExcel.Cells[i,4] := ADOStoredProc1DSDesigner4.AsVariant; MsExcel.Cells[i,5] := ADOStoredProc1Avg.AsVariant; MsExcel.Cells[i,6] := ADOStoredProc1DSDesigner8.AsVariant; MsExcel.Cells[i,7] := ADOStoredProc1Avg2.AsVariant; MsExcel.Cells[i,8] := ADOStoredProc1Sum.AsVariant; MsExcel.Cells[i,9] := ADOStoredProc1DSDesigner6.AsVariant; MsExcel.Cells[i,10] := ADOStoredProc1DSDesigner9.AsVariant; MsExcel.Cells[i,11] := ADOStoredProc1DSDesigner5.AsVariant; MsExcel.Cells[i,12] := ADOStoredProc1DSDesigner7.AsVariant; ADOStoredProc1.Next; Inc(i,1); end; end; ADOStoredProc1.Close; i:=10; MsExcel.Range[AA(1)+IntToStr(i), AA(XFieldCount)+IntToStr(XRecordCount+i)].Font.Size := 7; MsExcel.Range[AA(1)+IntToStr(i), AA(XFieldCount)+IntToStr(XRecordCount+i1)].Select; MsExcel.Selection.Borders[xlEdgeLeft].LineStyle := xlContinuous; // стиль линии сплошная MsExcel.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous; MsExcel.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous; MsExcel.Selection.Borders[xlEdgeRight].LineStyle := xlContinuous; MsExcel.Selection.Borders[xlInsideVertical].LineStyle := xlContinuous; MsExcel.Range[AA(1)+IntToStr(XRecordCount+i), AA(XFieldCount)+IntToStr(XRecordCount+i)].Select; MsExcel.Selection.Borders[xlEdgeLeft].LineStyle := xlContinuous; // стиль линии сплошная MsExcel.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous; MsExcel.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous; MsExcel.Selection.Borders[xlEdgeRight].LineStyle := xlContinuous; MsExcel.Selection.Borders[xlInsideVertical].LineStyle := xlContinuous; MsExcel.Selection.Font.Bold := True; n:=1; 20 Str := '=СУММ('+AA(n)+IntToStr(i)+':'+AA(n)+IntToStr(XRecordCount+i-1)+')'; MsExcel.Range[AA(n)+IntToStr(XRecordCount+i)].FormulaLocal := Str; n:=2; Str := AA(n)+IntToStr(i)+':'+AA(n)+IntToStr(XRecordCount+i-1); MsExcel.Range[AA(n)+IntToStr(XRecordCount+i)].NumberFormat := '0'; FStr := '=СУММ(ЕСЛИ(ЧАСТОТА(ПОИСКПОЗ('+Str+';'+Str+';0);ПОИСКПОЗ('+Str+';'+Str+';0))>0;1 ))'; MsExcel.Range[AA(n)+IntToStr(XRecordCount+i)].FormulaLocal := FStr; n:=3; Str := AA(n)+IntToStr(i)+':'+AA(n)+IntToStr(XRecordCount+i-1); MsExcel.Range[AA(n)+IntToStr(XRecordCount+i)].NumberFormat := '0'; FStr := '=СУММ(ЕСЛИ(ЧАСТОТА(ПОИСКПОЗ('+Str+';'+Str+';0);ПОИСКПОЗ('+Str+';'+Str+';0))>0;1 ))'; MsExcel.Range[AA(n)+IntToStr(XRecordCount+i)].FormulaLocal := FStr; n:=4; Str := AA(n)+IntToStr(i)+':'+AA(n)+IntToStr(XRecordCount+i-1); MsExcel.Range[AA(n)+IntToStr(XRecordCount+i)].NumberFormat := '0'; FStr := '=СУММ(ЕСЛИ(ЧАСТОТА(ПОИСКПОЗ('+Str+';'+Str+';0);ПОИСКПОЗ('+Str+';'+Str+';0))>0;1 ))'; MsExcel.Range[AA(n)+IntToStr(XRecordCount+i)].FormulaLocal := FStr; n:=5; Str := AA(n)+IntToStr(i)+':'+AA(n)+IntToStr(XRecordCount+i-1); FStr := '=ОКРУГЛ(СРЗНАЧ('+Str+');2)'; MsExcel.Range[AA(n)+IntToStr(XRecordCount+i)].FormulaLocal := FStr; n:=6; Str := AA(n)+IntToStr(i)+':'+AA(n)+IntToStr(XRecordCount+i-1); FStr := '=ОКРУГЛ(СРЗНАЧ('+Str+');2)'; MsExcel.Range[AA(n)+IntToStr(XRecordCount+i)].FormulaLocal := FStr; n:=7; Str := AA(n)+IntToStr(i)+':'+AA(n)+IntToStr(XRecordCount+i-1); FStr := '=ОКРУГЛ(СРЗНАЧ('+Str+');2)'; MsExcel.Range[AA(n)+IntToStr(XRecordCount+i)].FormulaLocal := FStr; n:=8; Str := AA(n)+IntToStr(i)+':'+AA(n)+IntToStr(XRecordCount+i-1); FStr := '=СУММ('+Str+')'; MsExcel.Range[AA(n)+IntToStr(XRecordCount+i)].FormulaLocal := n:=9; Str := AA(n)+IntToStr(i)+':'+AA(n)+IntToStr(XRecordCount+i-1); FStr := '=СУММ('+Str+')'; MsExcel.Range[AA(n)+IntToStr(XRecordCount+i)].FormulaLocal := n:=10; Str := AA(n)+IntToStr(i)+':'+AA(n)+IntToStr(XRecordCount+i-1); FStr := '=СУММ('+Str+')'; MsExcel.Range[AA(n)+IntToStr(XRecordCount+i)].FormulaLocal := n:=11; Str := AA(n)+IntToStr(i)+':'+AA(n)+IntToStr(XRecordCount+i-1); FStr := '=СУММ('+Str+')'; MsExcel.Range[AA(n)+IntToStr(XRecordCount+i)].FormulaLocal := n:=12; Str := AA(n)+IntToStr(i)+':'+AA(n)+IntToStr(XRecordCount+i-1); FStr := '=СУММ('+Str+')'; MsExcel.Range[AA(n)+IntToStr(XRecordCount+i)].FormulaLocal := FStr; FStr; FStr; FStr; FStr; for n:=1 to XFieldCount do begin if (n=1) or (n=3) or (n>=5) then begin MsExcel.Range[AA(n)+IntToStr(i), AA(n)+IntToStr(XRecordCount+i)].Select; MsExcel.Selection.HorizontalAlignment := xlRight; end; 21 if (n=2) then begin MsExcel.Range[AA(n)+IntToStr(i), AA(n)+IntToStr(XRecordCount+i)].Select; MsExcel.Selection.HorizontalAlignment := xlCenter; end; if (n=4) then begin MsExcel.Range[AA(n)+IntToStr(i), AA(n)+IntToStr(XRecordCount+i)].Select; MsExcel.Selection.HorizontalAlignment := xlCenter; end; end; MsExcel.Visible := True; Except showmessage('Внимание! Произошла ошибка приложения MS Excel'); //обрабатываем ошибки MsExcel.Workbooks.Close; //закроем все книги MsExcel.Application.quit; //закрываем Excel MsExcel := Unassigned; //освобождаем интерфейсы Main.Enabled:=True; Form2.Hide; Main.Show; end; Main.Enabled:=True; Form2.Hide; Main.Show; end; //-----------------------------------------------------------------------------procedure TMain.BitBtn2Click(Sender: TObject); var DateStart,DateFinish: TDateTime; XRecordCount,XFieldCount: integer; begin DateStart := StrToDateTime(DateToStr(DateOf(DateTimePicker1.Date))+' 00:00:00'); DateFinish := StrToDateTime(DateToStr(DateOf(DateTimePicker2.Date))+' 23:59:59'); ADOStoredProc1.Close; ADOStoredProc1.Parameters[0].Value := DateStart; ADOStoredProc1.Parameters[1].Value := DateFinish; ADOStoredProc1.Open; XRecordCount := ADOStoredProc1.RecordCount; XFieldCount := ADOStoredProc1.FieldCount; if XRecordCount=0 then ADOStoredProc1.Close; end; //-----------------------------------------------------------------------------procedure TMain.ComboBox1Change(Sender: TObject); begin if ComboBox1.ItemIndex<>CurYearItInd then begin ADOStoredProc2.Open; ADOStoredProc2.First; ComboBox2.Clear; while not ADOStoredProc2.Eof do begin ComboBox2.Items.Add(ADOStoredProc2Field.AsString); ADOStoredProc2.Next; end; ADOStoredProc2.Close; ComboBox2.ItemIndex:=-1; end; end; //-----------------------------------------------------------------------------procedure TMain.ComboBox1Click(Sender: TObject); begin 22 CurYearItInd := ComboBox1.ItemIndex; end; //-----------------------------------------------------------------------------procedure TMain.KolPechatiSrCenaNaPeriod(KodBumagi: Integer); var Ost,Outp,SumList,SumCount,KodBum: Integer; SumCen: Real; begin SumList:=0; SumCen:=0; ADOStoredProcOutp.Parameters[2].Value := KodBumagi; ADOStoredProcOutp.Parameters[1].Value := KodBumagi; ADOStoredProcOutp.Parameters[1].Value := KodBumagi; ADOStoredProcOst.Open; ADOStoredProcOst.First; Ost := ADOStoredProcOstOst.AsInteger; KodBum := ADOStoredProcPostKB.AsInteger; ADOStoredProcOst.Close; ADOStoredProcOutp.Open; ADOStoredProcOutp.First; Outp := ADOStoredProcOutpOutp.AsInteger; ADOStoredProcOutp.Close; ADOStoredProcPost.Open; while not(ADOStoredProcPost.Eof) or (Ost>0) do begin Ost := Ost - ADOStoredProcPostListov.AsInteger; ADOStoredProcPost.Next; end; Outp := Outp - Ost*(-1); SumCen := ADOStoredProcPostSebestL.AsFloat; SumList := Ost*(-1); SumCount := 1; while not(ADOStoredProcPost.Eof) or (Outp>0) do begin Outp := Outp - ADOStoredProcPostListov.AsInteger; ADOStoredProcPost.Next; SumCen := SumCen+ADOStoredProcPostSebestL.AsFloat; SumList := SumList+ADOStoredProcPostListov.AsInteger; Inc(SumCount,1); end; if (Outp<0) then SumList:=SumList-(Outp*(-1)); ADOStoredProcPost.Close; ADOTablePechSrCena.open; ADOTablePechSrCena.Append; ADOTablePechSrCenaKB.AsInteger:=KodBum; ADOTablePechSrCenaListov.AsInteger:=SumList; ADOTablePechSrCenaSrCenaList.AsFloat:=SumCen/SumCount; ADOTablePechSrCena.Post; ADOTablePechSrCena.Close; end; //-----------------------------------------------------------------------------end. //====================================================================================== 23