Поясняк (1230875), страница 5
Текст из файла (страница 5)
Chart1.View3D:=false;
end
else
MessageDlg('Не выбран месяц или год!',mtError,[mbOk],0);
Пример конечного вида диаграммы Гантта в компоненте TChart представлен на рисунке 2.22.
Рисунок 2.22 - Пример диаграммы Гантта на основе компонента TChart
2.1.5.3 Формирование табеля учета рабочего времени
Формирование табеля учета рабочего времени происходит на основе заготовленного Excel документа, в котором создана таблица по требованию руководства АО "Дальгипротранс". Поэтому в разрабатываемой программе необходимо организовать связь между компонентами Delphi и MS Excel.
На рисунке 2.23 показан документ Excel с таблицей.
Рисунок 2.23 - Документ Excel с разработанной таблицей
Одним из методов обработки и доступа в Delphi к данным Excel является применение объектов автоматизации OLE.
Один из методов доступа и обработки данных Excel базируется на применении объектов автоматизации OLE. В свою очередь, при использовании OLE можно выбрать один из двух возможных вариантов: применить класс IDispatch посредством переменных типа Variant или использовать интерфейсы COM. Несмотря на тесную взаимосвязь этих вариантов, между ними есть определенные различия. Использование переменных типа Variant упрощает программирование, но несколько замедляет работу приложения. Если же применить COM-интерфейсы, то производительность улучшится, но это потребует определенных усилий при программировании.[_] В разрабатываемой программе применяется метод, основанный на использовании переменных типа Variant. Поэтому в приложении используется переменная Exc типа OleVariant.
Для того, чтобы производить различные манипуляции с документом Excel, необходимо создать само приложение Excel, что достигается с помощью функции CreateOleObject:
Exc:=CreateOleObject('Excel.Application')
Впоследствии все действия будут выполняться с помощью объявленной переменной Exc. Для минимизации кода программы появилась необходимость создать переменные Doc и Str типа OleVariant, с помощью которых программа обращается непосредственно к документу Workbook, открытому в MS Excel, и рабочему листу Worksheets соответственно. Для этого вышеперечисленным переменным присвоены следующие значения:
Doc:=Exc.Workbooks.Add(PathExc);
Str:=Exc.Worksheets[1].
PathExc в данной функции означает путь к файлу Excel, с которым и будет вестись работа.
Для того, чтобы была возможность изменить путь к файлу Excel, создан дополнительный файл Info.ini. Это конфигурационный файл, содержащий необходимые сведения для работы приложения, который располагается в папке с исполнимым файлом самой программы учета рабочего времени. В этом файле указан раздел Path, в котором прописаны некоторые значения, одним из которых является путь к расположению файла.
После того, как открывается файл Excel, необходимо заполнить ячейки расположенной в нем таблицы. Для этого есть оператор Range['a', 'b'], где в качестве переменных a и b указываются ячейки таблицы, на основе которых будет выбран нужный диапазон a-b. Также можно указать один параметр для выбора одной ячейки, с которой впоследствии будут произведены манипуляции.
Для создания формулы есть оператор Formula, пример которого приведен ниже:
Str.Range['AK'+IntToStr(yach_FIO)].Formula:='=SUM(F'+IntToStr(yaсh_FIO) + ':AJ' + IntToStr(yach_FIO).
Ниже приведен полный код, отвечающий за формирование табеля учета рабочего времени.
procedure TForm5.Button8Click(Sender: TObject);
var Exc,Doc,Str: Olevariant;
Pathini,PathExc,DatN,DatK,shfr,FIO,Num1: String;
Ini: TIniFile;
yach_SH,yach_FIO,CounRec,i,j: integer;
D,M,Y: Word;
Date1: TDate;
Itog: array [1..31] of integer;
label l1;
begin
i:=1;
yach_SH:=20;
yach_FIO:=20;
if (mesac=-1) or (god=-1)
then MessageDlg('Выберите месяц и/или год',mtInformation,[mbOK],1)
else
begin
Pathini:=ExtractFilePath(Application.ExeName)+'Info.ini';
Ini:=TIniFile.Create(Pathini);
PathExc:=Ini.ReadString('Path','Excel','');
if FileExists(PathExc)
then
begin
datn:='01.'+mes[mesac+1]+'.'+CB2.Items.Strings[god];
datk:=IntToStr(day[mesac+1])+'.'+mes[mesac+1]+'.'+CB2.Items.Strings[god];
DM.DS_Exc.Close;
DM.DS_Exc.SelectSQL.Clear;
DM.DS_Exc.SelectSQL.Text:='select DATE_, SOTR_, RABOTA.SHIFR_, FIO_, ID_FIO, ZATR_TIME, OBJECTS.SHIFR_ as SHIFR1,ID_OBJ';
DM.DS_Exc.SelectSQL.Add(' FROM RABOTA,FIO,OBJECTS where (SOTR_ = ID_FIO) And (ID_OBJ = RABOTA.SHIFR_) and (Date_ between');
DM.DS_Exc.SelectSQL.Add(' '''+datN+''' AND '''+datK+''')');
DM.DS_Exc.SelectSQL.Add(' ORDER by SHIFR_, FIO_, DATE_');
DM.DS_Exc.Open;
DM.DS_Exc.Last;
CounRec:=DM.DS_Exc.RecordCount;
Exc:=CreateOleObject('Excel.Application');
Exc.Visible:=true;
Doc:=Exc.Workbooks.Add(PathExc);
Str:=Exc.Worksheets[1];
Str.Activate;
Str.Range['A15'].Value:='учета рабочего времени (по объектам) отдела АТС за '+CB1.Items.Strings[mesac]+' '+CB2.Items.Strings[god];
Str.Range['AJ13'].Value:=DateToStr(Now);
end
else
begin
MessageDlg('Не найден путь к фалйу Excel',mtError,[mbOk],1);
goto l1;
end;
DM.DS_Exc.First;
FIO:='';
shfr:=DM.DS_Exc.FBN('SHIFR1').AsString;
WHILE NOT DM.DS_Exc.EOF DO
begin
if (DM.DS_Exc.FBN('SHIFR1').asString=shfr) then
begin
if (DM.DS_Exc.FBN('FIO_').asString=FIO) and
(Date1=DM.DS_Exc.FBN('DATE_').AsDateTime) then
begin
yach_FIO:=yach_FIO-1;
DecodeDate(DM.DS_Exc.FBN('DATE_').AsDateTime,Y,M,D);
Num1:=Str.Range[DayExc[D]+IntToStr(yach_FIO)].Value; Str.Range[DayExc[D]+IntToStr(yach_FIO)].Value:=IntToStr(StrToInt(Num1)+StrToInt(DM.DS_Exc.FBN('ZATR_TIME').AsString)); Str.Range['AK'+IntToStr(yach_FIO)].Formula:='=SUM(F'+IntToStr(yach_FIO)+':AJ'+IntToStr(yach_FIO);
Itog[D]:=Itog[D]+StrToInt(DM.DS_Exc.FBN('ZATR_TIME').AsString);
DM.DS_Exc.Next;
yach_FIO:=yach_FIO+1;
end
else
if DM.DS_Exc.FBN('FIO_').AsString=FIO then
begin
yach_FIO:=yach_FIO-1;
DecodeDate(DM.DS_Exc.FBN('DATE_').AsDateTime,Y,M,D);
Num1:=Str.Range[DayExc[D]+IntToStr(yach_FIO)].Value; Str.Range[DayExc[D]+IntToStr(yach_FIO)].Value:=DM.DS_Exc.FBN('ZATR_TIME').AsString; Str.Range['AK'+IntToStr(yach_FIO)].Formula:='=SUM(F'+IntToStr(yach_FIO)+':AJ'+IntToStr(yach_FIO);
Date1:=DM.DS_Exc.FBN('DATE_').AsDateTime;
Itog[D]:=Itog[D]+Str.Range[DayExc[D]+IntToStr(yach_FIO)].Value;
DM.DS_Exc.Next;
yach_FIO:=yach_FIO+1;
end
else
begin
DecodeDate(DM.DS_Exc.FBN('DATE_').AsDateTime,Y,M,D); Str.Range['E'+IntToStr(yach_SH)].Value:=DM.DS_Exc.FBN('SHIFR1').AsString; Str.Range['B'+IntToStr(yach_FIO)].Value:=DM.DS_Exc.FBN('FIO_').AsString; Str.Range[DayExc[D]+IntToStr(yach_FIO)].Value:=DM.DS_Exc.FBN('ZATR_TIME').AsString; Str.Range['AK'+IntToStr(yach_FIO)].Formula:='=SUM(F'+IntToStr(yach_FIO)+':AJ'+IntToStr(yach_FIO);
FIO:= DM.DS_Exc.FBN('FIO_').AsString;
Date1:=DM.DS_Exc.FBN('DATE_').AsDateTime;
Str.Range['A'+IntToStr(yach_FIO)].Value:=i;
Itog[D]:=Itog[D]+Str.Range[DayExc[D]+IntToStr(yach_FIO)].Value;
DM.DS_Exc.Next;
yach_SH:=yach_SH+1;
yach_FIO:=yach_FIO+1;
i:=i+1;
end;
end
else
begin
Str.Range['B'+IntToStr(yach_FIO)].Value:='Итого';
Str.Range['AK'+IntToStr(yach_FIO)].Formula:='=SUM(F'+IntToStr(yach_FIO)+':AJ'+IntToStr(yach_FIO);
for D:=1 to 31 do
begin
if Itog[D]<>0 then
Str.Range[DayExc[D]+IntToStr(yach_FIO)].Value:=Itog[D];
end;
yach_SH:=yach_SH+2;
yach_FIO:=yach_FIO+2;
shfr:=DM.DS_Exc.FBN('SHIFR1').AsString;
FIO:='';
i:=1;
for D:=1 to 31 do Itog[D]:=0;
end;
end;
if (DM.DS_Exc.EOF=true) and (DM.DS_Exc.RecordCount<>0) then
begin
Str.Range['B'+IntToStr(yach_FIO)].Value:='Итого';
Str.Range['AK'+IntToStr(yach_FIO)].Formula:='=SUM(F'+IntToStr(yach_FIO)+':AJ'+IntToStr(yach_FIO);
for D:=1 to 31 do
begin
if Itog[D]<>0 then
Str.Range[DayExc[D]+IntToStr(yach_FIO)].Value:=Itog[D];
end;
end;
end;
l1:
end;
2.1.6 Создание информационной БД технологического процесса проектирования
БД – организованная специальным образом взаимосвязанная информация об объектах.
Основной формой предоставления информации, содержащейся в БД, является таблица. Таблица – набор записей (строк), состоящих из отдельных полей (столбцов), в которых хранится информация и составляющая, собственно, содержание базы данных.
В дипломном проекте разрабатывается БД DGPT.GDB, состоящая из 29 таблиц.
На листе 2 графического материала показана структура БД, на листе 5 - структура базы данных автоматизированного рабочего места
Ниже содержится краткое описание таблиц.
Таблица 2.1 – CARTA_O – содержит данные для карточки объекта, т.е. все необходимые данные по проекту, заполняемые ГИПом .
Таблица 2.1 – Структура таблицы CARTA_O
| PK | FK | Поле | Тип | NN | Описание |
|
| OID | INTEGER, TOID |
| OID проекта | |
|
| ID_PR | INTEGER, TOID |
| ID проекта | |
| TITUL | BLOB (TEXT, 300) |
| Титул объекта | ||
| OPISANIE | BLOB (TEXT, 400) |
| Описание | ||
|
| ID_ZAC | INTEGER, TOID |
| Заказчик | |
|
| ISH_ZAD | INTEGER |
| Исходное задание | |
|
| TU_TZ | INTEGER |
| ТУ, ТЗ | |
| K_RAI | FLOAT |
| Районный коэффициент | ||
| K_INFL | FLOAT |
| Инфляционный коэффициент | ||
| K_2697 | FLOAT |
| Коэффициент по Р-2697 | ||
| TERM_OT | TIMESTAMP |
| Срок от | ||
| TERM_DO | TIMESTAMP |
| Срок до | ||
|
| ID_ORG | INTEGER, TOID |
| Организация | |
| CODE_ | INTEGER |
| Шифр объекта | ||
|
| ID_OT | INTEGER, TOID |
| ID отдела | |
|
| ID_ST | INTEGER, TOID |
| ID стадии |
Таблица 2.2 – FIO – содержит все необходимые данные о сотрудниках организации ОАО «Дальгипротранс».















