Разработка программного комплекса расчета компенсаций по капитальному ремонту

Анализ существующих систем по расчету компенсаций по капитальному ремонту. Разработка автоматизированной информационной системы в среде разработки Delphi. Требования к организации загрузки данных. Реализация программных модулей и тестирование системы.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 19.01.2017
Размер файла 3,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Рисунок 6.12- Выгрузка данных

//Процедура выгрузки данных по рассчитанным льготам в органы соц.защины населения

procedure TUploadOSZNForm.UploadToDBF;

var s,s_ord,ps,ps_u,pcode:string;

tot,pr,sm,smd:double;

n,m,lcount,fs, lc_id:integer;

f:file;//Для работы с DBF-файлом напрямую, через файловые операции

s1,s2:string;

isMunic:boolean;//Признак муниципального документа.

//От этого зависит формат DBF-таблицы

const NB:byte = 101;//Код для DBF-файла.

//Кодовая страница CP866 (файл ОСЗН имеет не

//совсем стандартный заголовок и для того, чтобы

//все у принимающей стороны все правильно

//загрузилось, принудительно будем менять DBF-заголовок

begin

If ID_Doc500=0 then begin

MessageDlg('Необходимо выбрать документ для выгрузки!', mtWarning, [mbok], 0);

exit;

end;

//Выгрузка данных льгот в DBF

Try

//Вывод на экран формы ожидания

WaitForm:=TWaitForm.Create(self);

WaitForm.Label1.Caption:='Выборка данных...'+#13+'Пожалуйста, подождите';

WaitForm.Button1.Visible:=true;

WaitForm.Label2.Visible:=true;

WaitForm.Label2.Caption:='';

WaitForm.Label3.Visible:=false;

WaitForm.ProgressBar1.Visible:=true;

WaitForm.Show;

Application.ProcessMessages;//Обновление всех окон программы

Screen.Cursor:=crHourglass;//Курсор «песочные часы»

s:=Inttostr(ComboBox6.ItemIndex+1);

if length(s)<2 then s:='0'+S;

ps:=Inttostr(SpinEdit3.Value)+s;//Расчетный период ФКР

//Загрузим из файла текст SQL-запроса

DM.TempQuery.Close;

DM.TempQuery.SQL.LoadFromFile(appdata+'\SQL\UploadOSZN.sql');

ps_u:=s+'.'+copy(Inttostr(SpinEdit3.Value),3,2);//Период ОСЗН

DM.TempQuery.ParamByName('D1_ID').AsInteger:=ID_Doc500;

DM.TempQuery.ParamByName('Per').AsString:=ps;

DM.TempQuery.ParamByName('D1_ID').AsInteger:=ID_Doc500;

//Сортировка выгружаемых данных. Задается в форме настройки.

case RadioGroup1.ItemIndex of

0:s_ord:='order by d1.f_recnum';

1:s_ord:='order by (Case NVL(SUM(a.f_pepamount),0) when 0 then 0 else 1 end) desc, d1.f_src_fname, d1.f_src_name, d1.f_src_sname';

end;{case}

SetOrder(DM.TempQuery,s_ord,true);//Ф-ия замены строки ORDER запроса

// DM.TempQuery.SQL.SaveToFile(appdata+'\temp\test_upload.sql'); {используем для тестирования}

if DM.TempQuery.RecordCount>0 then begin

pcode:=DM.TempQuery.FieldByName('P_CODE').AsString;

if length(pcode)<2 then pcode:='0'+pcode;

if length(pcode)<3 then pcode:='0'+pcode;

DM.TempQuery.FetchAll;

WaitForm.Label1.Caption:='Выгрузка данных...'+#13+'Пожалуйста, подождите';

WaitForm.Refresh;

lcount:=DM.TempQuery.RecordCount;

tot:=0;pr:=100/lcount;

//Создадим таблицу DBF

DM.UploadTable.DatabaseName:=Options.UploadDir;

DM.UploadTable.TableName:='G'+OSZNCode+pcode+s+'.dbf';//Имя файла

//Проверка и корректировка имени файла. Если такой файл существует -

//добавим в имя «_2», затем «_3» и т.д., пока не найдем имя,

//которого еще нет. Ограничиваем нумерацию числом 100.

n:=1;

While (FileExists(DM.UploadTable.DatabaseName+ '\'+ DM.UploadTable.TableName)) and (N<100) do begin

inc(n);

DM.UploadTable.TableName:='G'+OSZNCode+pcode+s+'_'+inttostr(n)+'.dbf';

end;

DM.UploadTable.TableType:=ttDBase;

DM.UploadTable.TableLevel:=3;

DM.UploadTable.FieldDefs.Clear;

DM.DBFTable.DatabaseName:=appdata+'\SQL';

isMunic:=(DM.TempQuery.FieldByName('f_ismunic').AsInteger=1);

if not isMunic then

s:=appdata+'\OSZN_Header_F.DBF' //Феделальный/областной формат

else

s:=appdata+'\OSZN_Header_M.DBF';//Муниципальный формат

CopyFile(PChar(s), PChar(DM.UploadTable.DatabaseName+ '\' + DM.UploadTable.TableName), true);

DM.UploadTable.Open;

isBreak:=false;

While (not DM.TempQuery.Eof)and (isBreak=false) do begin

WaitForm.Label2.Caption:='Записи: '+Inttostr(DM.TempQuery.RecNo)+' / '+Inttostr(DM.TempQuery.RecordCount);//Показ счетчика записей

Application.ProcessMessages;

s:=DM.TempQuery.FieldByName('f_recnum').AsString;

//Построчная выгрузка в DBF

DM.UploadTable.Insert;

DM.UploadTable.FieldByName('KOD_R').Value := DM.TempQuery.FieldByName('KOD_R').Value;

//Заполним все поля с совпадающими именами

for n:= 0 to DM.TempQuery.FieldCount-1 do begin

if DM.UploadTable.FindField( DM.TempQuery.Fields[n].DisplayName)<>nil then begin

if UPPERCase(DM.TempQuery.Fields[n].DisplayName)<>'SNILS' then begin

if (DM.TempQuery.Fields[n].DataType<>ftString)and(DM.TempQuery.Fields[n].DataType<>ftWideString) then

DM.UploadTable.FindField(DM.TempQuery.Fields[n].DisplayName).Value:=DM.TempQuery.Fields[n].Value

else

DM.UploadTable.FindField(DM.TempQuery.Fields[n].DisplayName).AsString:=DM.TempQuery.Fields[n].AsString;

end else begin //У СНИЛС-а вырежем лишние символы

//Это особенность хранения данного кода у нас и у ОСЗН

s:=StringReplace(DM.TempQuery.Fields[n].AsString,'-','',[rfReplaceAll]);

s:=StringReplace(s,' ','',[rfReplaceAll]);

DM.UploadTable.FindField(DM.TempQuery.Fields[n].DisplayName).Value:=s;

end;

end;

end;

// Номер дома поправим. Тут надо отрезать все, после цифр

s:=TrimAll(DM.TempQuery.FieldByName('HOUSE').AsString);

s1:='';

s2:=DM.TempQuery.FieldByName('KORP').AsString;

for n:=1 to length(s) do begin

if s[n] in ['0'..'9'] then s1:=s1+s[n]

else s2:=s2+s[n];

end;

DM.UploadTable.FieldByName('HOUSE').Value:=s1;

DM.UploadTable.FieldByName('KORP').Value:=s2;

//Остальные поля

if DM.UploadTable.FieldByName('K_FLAT').AsInteger<>1 then //Сумму в 0, это не льгота. Нет номера квартиры - дом частный.

DM.UploadTable.FieldByName('SUMMA1').AsFloat:=0;//Сумма льготы

DM.UploadTable.FieldByName('PERIOD').AsString:=ps_u;//Период

DM.UploadTable.FieldByName('ORG_PLAT').AsInteger:=DM.TempQuery.FieldByName('p_code').AsInteger;

DM.UploadTable.FieldByName('LC_ID').AsString:=DM.UploadTable.FieldByName('LCHET').AsString;

if DM.UploadTable.FieldByName('K_FLAT').AsInteger=1 then begin //Собственность физ.лица. льгота имеет смысл (иначе не предоставляется)

//Наличие задолженности

//Сначала нужно выяснить подходящий лицевой счет

{ DM.TempQuery2.close;

DM.TempQuery2.SQL.Text:='SELECT * FROM rt_cr_lacc WHERE f_room_id = '+

inttostr(DM.TempQuery.FieldByName('r_id').AsInteger)+' and f_state=1';

DM.TempQuery2.Open;DM.TempQuery2.FetchAll;

smd:=0;

if DM.TempQuery2.RecordCount>0 then begin

while not DM.TempQuery2.Eof do begin

lc_id:=DM.TempQuery2.FieldByName('id').AsInteger;

smd:=smd+GetLSSaldo(lc_id,today);

end;

end;

DM.TempQuery2.close;}

if (DM.UploadTable.FieldByName('SUMMA_D').AsFloat>0) then begin

//Проаналитзируем величину задолженности. Д.б. не меньше 3х-кратного

//ежемесячного начисления. Иначе льгота не предоставляется.

sm:=GetRoomAmount(SpinEdit3.Value,ComboBox6.ItemIndex+1,DM.TempQuery.FieldByName('r_id').AsInteger);

if DM.UploadTable.FieldByName('SUMMA_D').AsFloat>=(sm*3) then begin //Есть долг

DM.UploadTable.FieldByName('P_DOLG').AsInteger:=1;

DM.UploadTable.FieldByName('SUMMA_D').AsFloat:=DM.UploadTable.FieldByName('SUMMA_D').AsFloat;

end else begin //Нет долга

DM.UploadTable.FieldByName('P_DOLG').AsInteger:=0;

DM.UploadTable.FieldByName('SUMMA_D').AsFloat:=0;

end;

end else begin

DM.UploadTable.FieldByName('P_DOLG').AsInteger:=0;

DM.UploadTable.FieldByName('SUMMA_D').AsFloat:=0;

end;

DM.UploadTable.FieldByName('SUMMA2').AsFloat:=DM.TempQuery.FieldByName('RC_SUM').AsFloat;

end else begin //Это иная форма собственности, льготы тут не считаем

DM.UploadTable.FieldByName('P_DOLG').AsInteger:=0;

DM.UploadTable.FieldByName('SUMMA_D').AsFloat:=0;

DM.UploadTable.FieldByName('SUMMA2').AsFloat:=0;

end;

If isMunic then m:=10 else m:=20;

for n:=3 to m do begin

DM.UploadTable.FieldByName('SUMMA'+inttostr(n)).AsFloat:=0;

DM.UploadTable.FieldByName('K_USL'+inttostr(n)).AsInteger:=24;

end;

DM.UploadTable.Post;

DM.TempQuery.Next;

tot:=tot+pr;

WaitForm.ProgressBar1.Position:=trunc(tot);

end;

DM.UploadTable.Close;

DM.TempQuery.close;

//Еще надо подправить байт кодировки...

AssignFile(f,DM.UploadTable.DatabaseName+'\'+DM.UploadTable.TableName);

FileMode:=2;

Reset(f,1);

Seek(f,29);//29-й байт от начала файла - кодовая страница.

BlockWrite(f,NB,1);

fs:=FileSize(f);

CloseFile(f);

//Теперь создадим файл акта для получателя. Он в формате MS Word.

//lcount - кол-во лиц

//fs - размер файла

//DM.UploadTable.TableName - имя файла

WaitForm.Label1.Caption:='Формирование акта приема-передачи...'+#13+'Пожалуйста, подождите';

WaitForm.Refresh;

DM.TempQuery.Close;

DM.TempQuery.SQL.Text:='SELECT * FROM rt_pep_oszndocs WHERE id='+inttostr(ID_Pol);

DM.TempQuery.Open;

//Тут используем функции модуля WordKR для удобства работы с MS Word.

If CreateWord(VWord) then begin //Создание соединения с COM-сервером Word

VisibleWord(VWord,false);//Скрыть Word

OpenDoc(VWord,appdata+'\Templates\Act_templ.docx');//Шаблон

CopyAllDoc(VWord);

CloseDoc(VWord);

AddDoc(VWord);

PasteAllDoc(VWord);

//Дальше работаем в защищенной секции Try…Except с обработкой ошибок

Try

//Заполнение реквизитов в печатной форме

//Функция FindAndPasteTextDoc находит и заменяет определенный метки на

//нужный текст.

FindAndPasteTextDoc(VWord,'[DOC_NUMBER]', DM.TempQuery.FieldByName('DOC_NUMBER').AsString);

FindAndPasteTextDoc(VWord,'[DOC_DATE]', DM.TempQuery.FieldByName('DOC_DATE').AsString);

FindAndPasteTextDoc(VWord,'[OSZN_NAME]', DM.TempQuery.FieldByName('OSZN_NAME').AsString);

FindAndPasteTextDoc(VWord,'[FL_COUNT]', Inttostr(lcount));

FindAndPasteTextDoc(VWord,'[FILENAME]', DM.UploadTable.TableName);

FindAndPasteTextDoc(VWord,'[FILESIZE]', Inttostr(fs)+' байт');

FindAndPasteTextDoc(VWord,'[CDAY]', Inttostr(DayOf(Today)));

FindAndPasteTextDoc(VWord,'[CMONTH]', ANSILowerCase(MonthsR[(MonthOf(Today))]));

FindAndPasteTextDoc(VWord,'[CYEAR]', Inttostr(YearOf(Today)));

//Сохраним полученный файл

SaveDocAs(VWord,DM.UploadTable.DatabaseName+'\'+StringReplace(DM.UploadTable.TableName,'.dbf','.docx',[rfReplaceAll]));

CloseDoc(VWord);

VWord:=0;

Except //При «общении» с Вордом возникла ошибка…

on e:exception do begin

WaitForm.Free;Screen.Cursor:=crDefault;

WriteLog('Выгрузка данных для ОСЗН. Ошибка при получении формы Акта в MS Word.',e.Message,2);

MessageDlg('Ошибка при Получении формы Акта в MS Word!'+#13+'Файл с данными создан учпешно.'+#13+'Ошибка: '+e.Message,mtError,[mbOk],0);

CloseDoc(VWord);

VWord:=0;

end;

End;

end;

// end;

WaitForm.Free;Screen.Cursor:=crDefault;

if not isBreak then begin

WriteLog('Выгрузка данных для ОСЗН','ID документа: '+inttostr(ID_Doc500),5);//Запись в журнал событий

MessageDlg('Выгрузка успешно завершена!'+#13+

'Файл: '+DM.UploadTable.DatabaseName+'\'+DM.UploadTable.TableName,mtInformation,[mbOk],0);

end else begin

WriteLog('Выгрузка данных для ОСЗН (прервано пользователем!)','ID документа: '+inttostr(ID_Doc500),5);

MessageDlg('Выгрузка прервана пользователем, данные неполные!'+#13+

'Файл: '+DM.UploadTable.DatabaseName+'\'+DM.UploadTable.TableName,mtWarning,[mbOk],0);

end;

end else begin

DM.UploadTable.Close;

DM.TempQuery.close;

WaitForm.Free;Screen.Cursor:=crDefault;

MessageDlg('Нет данных для выгрузки по уазанным параметрам!',mtWarning,[mbOk],0);

end;

Except //Общая обработка ошибок

on e:exception do begin

// UploadOSZNForm.enabled:=true;

DM.UploadTable.Close;

DM.TempQuery.close;

WaitForm.Free;Screen.Cursor:=crDefault;

WriteLog('Выгрузка данных для ОСЗН. Ошибка.',e.Message,2);

MessageDlg('Ошибка при сохранении данных в файл DBF!'+#13+e.Message,mtError,[mbOk],0);

end;

End;

end;

//Конец процедуры

7. ОТЛАДКА И ЭКСПЕРИМЕНТАЛЬНОЕ ТЕСТИРОВАНИЕ

Среда разработки Delphi XE5 имеет достаточно мощные средства отладки приложения в процессе разработки. Перед компиляцией программы можно выбрать режим работы: Debug - с включением отладочной информации для работы дебаггера или Release - чистый исполняемый файл, без отладочной информации. Для отладки используется первый режим, для получения конечного исполняемого файла, который планируется распространять для использования в организации - режим Release[12].

В режиме Debug возможна полноценная отладка программы - с установкой точек останова во время выполнения, с просмотром (и, при необходимости, изменением) значений переменных. Просмотр значений достаточно удобен - в понятной форме просматриваются как простые, так и сложные типы данных (многомерные массивы, объекты, классы и пр.).

Каждый модуль в процессе тестирования проверялся в несколько этапов:

1) первоначальная компиляция, выявление синтаксических ошибок, ошибок логики и порядка разработки. На этом этапе нужно, чтобы программа откомпилировалась и запустилась без «красных» ошибок;

2) проверка правильности реализации основных функций модуля. Здесь выясняется, насколько работа реализованных алгоритмов соответствует предъявляемым к ним требованиям. То есть, выполняет ли программа то, что было задумано на этапах проектирования и разработки;

3) проверка на «живучесть». При этом проверятся устойчивость алгоритмов при вводе нестандартных значений, «защита от дурака».

После вышеуказанных проверок, программа отдается на тестирование специалистам в конкретной предметной области (в нашем случае - бухгалтерии), которые могут выявить ошибки и недочеты, не учтенные на этапе первоначальной разработки. Также уточняется такая немаловажная сторона работы с программой, как эргономика - удобство работы с интерфейсом программы, его «дружественность», быстрый доступ к наиболее важным и часто используемым функциям.

После тестирования специалистами, производится сборка рабочей версии программы в режиме Release. Для распространения версии по всем рабочим станциям используется функция автоматического обновления.

Так же присутствует функция автоматического обновления. В базе данных предусмотрена специальная таблица KR_UPDATES, содержащая версию программы, краткое описание, некоторую служебную информацию и, самое главное, поле типа BLOB - Binary Large Object или «большой бинарный объект». Данное понятие относится к СУБД и означает, что в поле таблицы хранятся не простые данные (строка, число, дата и т.п.), а совершенно произвольный набор байт. Им может быть что угодно - изображение, документ, архивный файл или даже другая программа. Я в рамках данного проекта использую поле BLOB для хранения архива в формате ZIP, содержащего все файлы, изменившиеся с момента предыдущей версии[16].

Операционная система не позволить удалить или перезаписать файл, который в данный момент открыт или исполняется. Соответственно, запущенная программа не может быть перезаписана новой версией той же программы и для того, чтобы обновить основной исполняемый файл, нужно закрыть программу. Но тогда какая-то другая программа должна будет заменить файл (основная уже не работает). Чтобы это стало возможным, было разработано отдельное небольшое приложение, единственной задаче которого является ожидание завершения работы основной программы, и замена ее (а также всех сопутствующих файлов) на новую версию. Эта программа называется AutoUpdater, полный исходный код ее приведен ниже.

Для пользователя обновление происходит автоматически - при запуске основной программы, на экране появляется сообщение, представлено на рисунке 7.1.

Рисунок 7.1- Скриншот обновление

При нажатии кнопки «Да» программа закрывается и запускается AutoUpdater, который и производит все дальнейшие операции. Необходимые данные от основной программы передаются ему через параметры командной строки.

Также при работе программы каждые 10 минут происходит опрос сервера на наличие обновленной версии. В случае её обнаружения происходит то же самое что и при запуске - выдача сообщения и, при согласии пользователя, обновление программы.

Таким образов в процессе разработки и тестирования происходило обновление программного обеспечения.

8. РАЗРАБОТКА ТЕХНИЧЕСКОЙ ДОКУМЕНТАЦИИ. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

Автоматизированная информационная система обладает простым и удобным интерфейсом. Связь с программой обеспечивается по средствам использования клавиатуры и манипулятора типа мышь.

Для запуска программы необходима произвести двойной клик по ярлыку программы, представлено на рисунке 8.1.

Рисунок 8.1- Ярлык

Для входа в программу необходимо ввести логин и пароль, представлено на рисунке 8.2.

Рисунок 8.2- Вход в программу

Для расчета льгот необходимо открыть меню действия и кликнуть пункт расчет льгот, представлено на рисунке 8.3.

Рисунок 8.3- Расчет льгот

Далее определить период (месяц расчета), район или город и вид льгот (федеральные либо муниципальные), представлено на рисунке 8.4.

Рисунок 8.4- Параметры

После того как выполнится расчет необходимо закрыть всплывающееся окно и перейти к меню сервис и перейти на пункт обмен данными, далее выбрать из раскрывающегося списка пункт выгрузка рассчитанных льгот для ОСЗН, представлено на рисунке 8.5.

Рисунок 8.5- Выгрузка рассчитанных льгот

Далее определить период выгрузки, название документа и получателя файла и нажать кнопку выполнить, представлено на рисунке 8.6. Получившийся файл будет сохранен в заранее настроенной папке. Данная настройка производится в меню сервис, пункт настройка программы.

Рисунок 8.6- Параметры выгрузки

ЗАКЛЮЧЕНИЕ

Применение новых современных информационных технологий, позволяющих более эффективно хранить и обрабатывать все возрастающие объемы информации, призвано обеспечить своевременное заполнение необходимых баз данных достоверной информацией, провести их актуализацию, необходимые расчеты.

В данном дипломном проекте рассмотрено создание автоматизированной информационной системы по расчету льгот отдельным категориям граждан по уплате взносов на капитальный ремонт. Создан программный комплекс в среде разработки Delphi с использованием базы данных Oracle.

Автоматизированная информационная система устанавливается на компьютер пользователя и локально хранится на нем. Связь с базой данных осуществляется посредствам сети интернет.

Были рассмотрены основные компоненты и технологические процессы автоматизированных информационных систем, а также проанализированы существующие решения подобных разработок в других регионах РФ и определены их основные задачи, минусы и плюсы, и их недостатки. В дальнейшем была поставлена задача спроектировать автоматизированную информационную систему и определен будущий функционал программы.

Данное решение позволит полностью решить задачу своевременного расчета льгот и полностью автоматизирует этот процесс. Этой задачей в организации до применения автоматизированной информационной системы занимались на ежемесячной основе три специалиста. Можно сделать вывод о том, что при должном подходе и правильном проектировании информационных систем они позволяют автоматизировать и облегчить работу с информацией на предприятии, повысить эффективность труда работников.

Также автоматизированная информационная система будет модернизироваться. В будущем она позволит решать такие задачи, как ведение расчетов с абонентами, банковские операции, ведение специальных счетов собственников помещений, реализация краткосрочно плана проведения капитальных ремонтов многоквартирных домов и так далее. Создание WEB формы позволит работать с программой не только из локально-вычислительной сети организации, но и из любой точки мира по средствам сети интернет. Также существует множество планов и идей по развитию и совершенствованию программы. Наладка взаимодействия с сайтом организации, с автоматизированными информационными системами органом социальной защиты населения напрямую, а не посредствам обмена файлами информационного обмена.

Автоматизированная информационная система успешна внедрена и используется в Некоммерческой организации Вологодской области «Фонд капитального ремонта многоквартирных домов Вологодской области».

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. О реализации закона области от 5 февраля 2009 года N 1956-ОЗ "О форме предоставления мер социальной поддержки по оплате жилого помещения и коммунальных услуг отдельным категориям граждан: постановлениям Правительства Вологодской области от 16.04.2010г № 401

2. О Порядке предоставления денежных компенсаций на оплату жилого помещения и коммунальных услуг отдельным категориям граждан: постановлениям Правительства Вологодской области от 16.04.2010г № 402

3. Архангельский, А.Я. Приемы программирования в Delphi/ А.Я. Архангельский. - Москва: Бином-Пресс, 2006. - 944 с.

4. Бескоровайный, И.В. Азбука Delphi: Программирование с нуля/ И.В. Бескоровайный. - Екатеринбург: Сибирский университет, 2008. - 112 с.

5. Бобровский, С.И. Delphi 7: учебный курс / С.И. Бобровский. - Санкт-Петербург: Питер, 2005. - 736 с.

6. Голицына, О.Л. Языки программирования: учебное пособие/ О.Л. Голицына, Т.Л. Партыка, И.И. Попов. - Москва: Форум, 2008.- 400 с.

7. Емельянова, Н.З. Основы построения автоматизированных информационных систем: учебное пособие для студентов/ Н.З. Емельянова, Т.А. Партыка. - Москва: Форум, 2011. - 416 с.

8. Карпова, Т.А. Базы данных. Модели, разработка, реализация: учебное пособие/ Т.А. Карпова. - Санкт-Петербург: Питер, 2008. - 304 с.

9. Фленов, М.Е. Библия Delphi 7 / М. Фленов. - Минск: BHV, 2007. - 800 с.

10. Джефферсон, А.А. Десять главных рекомендаций по настройке приложений/А.А, Джефферснон//Russian Oracle Internet Magazine. - 2000. - 22 мая С.22-41.

Размещено на Allbest.ur


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.