Uploaded by ilyaskulyabin

Базы Данных Курсовой проект отчет 1 курс Delphi Access

advertisement
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ФИЛИАЛ _________________________________________________
КАФЕДРА№
ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ И СИСТЕМ В ЭКОНОМИКЕ.
КУРСОВАЯ РАБОТА ПО ДИСЦИПЛИНЕ
«Программирование на языке высокого уровня»
ТЕМА: «Создание отчета 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
Download