Автоматизированная система ведения бухгалтерского и оперативного учета
Анализ языков программирования и выбор среды разработки. Обзор этапов программирования, серверные процедуры, структурная база данных. Описание функциональной структуры программного комплекса. Описание методики тестирования, пользовательский интерфейс.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 21.11.2010 |
Размер файла | 4,9 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Введение
Целью дипломного проектирования является создание программного продукта предназначенного для автоматизации, бухгалтерского и оперативного учета.
Внедрение разработанного программного продукта позволит быстро и эффективно вводить, обрабатывать и получать нужную информацию, при этом значительно сократив затраты, связанные с вводом обработкой и хранением информации, и тем самым освободит от хранения большого объема информации на бумаге.
Несмотря на огромное существование аналогичных программных продуктов, например 1С:Торговля и Склад, КС: торговый склад , и множество других, возникла необходимость в создании собственного программного продукта, который отвечал бы всем требованиям компании и при необходимости дорабатывался собственным программным отделом.
Тема данной дипломной работы была предложена торговой компанией. Одно из направлений деятельности данной компании, является производство жалюзи, карнизов и т.д. Организация ведения учета на данном программном продукте позволит:
· Быстро и в удобной форме вводить основные документы (заказы, кассовые, банковские, по движению товаров на складах)
· Получать на основе введенных документов разнообразные отчеты (заявки на завод, технологические карты, финансовые отчеты, маркетинговые отчеты и т.д.)
Постановка задачи
Целью данной дипломной работы является разработка системы автоматизации, бухгалтерского и оперативного учета. Каждый сотрудник отдела имеет на своем рабочем месте персональный компьютер, с установленной на нем ОС Windows 98. Установлена локальная вычислительная сеть с выделенным сервером на базе ОС Windows2000 Server и SQL SERVER компании SYBASE. Сотрудники занимаются вводом и проверкой полученной информации от заказчика, следят за состоянием заказа, а так же формируют соответствующие отчеты. Для эффективной работы подразделения требуется разработать программный комплекс, отвечающий следующим требованиям:
1. Предоставление каждому пользователю доступа только к тем документам, которые действительно ему необходимы. Поэтому программный комплекс необходимо разбить на следующие подсистемы:
· ввод заказов;
· документы по движению товаров на складах;
· кассовые документы;.
· прочие документы.
2. Удобный и интуитивно понятный для пользователя интерфейс ввода, редактирования и поиска информации.
3. Без ошибочное отражение хранимой информации.
Анализ языков программирования и выбор среды разработки
Сегодня, среди всего разнообразия средств разработки различных приложений в среде Windows таких как Borland Delphi, Visual Basic, C++ Builder и других очень трудно выбрать действительно удобное средство разработки приложений. Для данного дипломного проекта было выбрано средство разработки клиент/серверных приложений компаний Powersoft и Sybase, PowerBuilder 6 [1].
C момента появления первой версии PowerBuilder прошло более шести лет. Сейчас PowerBuilder занимает ведущие позиции на рынке инструментальных средств разработки систем клиент/сервер для управления базами данных. Первая версия PowerBuilder работала только на 16-битовой платформе Windows 3.х, не поддерживала объектно-ориентированные средства разработки и позволяла создавать только SDI-приложения. Начиная с PowerBuilder 2, разработки получили возможность строить MDI-приложения и использовать механизм наследования меню и окон. В PowerBuilder 3 появились пользовательские объекты, панели инструментов MDI, расширенная DataWindow, включая различные виды отчетов и возможность создания графиков и диаграмм. В PowerBuilder 4 повысилась производительность приложений, появились сводные и вложенные отчеты, генератор классов C++, расширенная поддержка OLE 2.0 и средство PowerTip. С PowerBuilder 5. пришли Distributed PowerBuilder, компиляция до уровня машинных кодов, плавающие панели инструментов и возможность переопределения функций. Появилась также средства доступа к свойствам и данным объектов DataWindow, аргументы событий, пересылка функций и управляющие элементы Windows 95, включая вкладки, средства просмотра деревьев и списков, списки с изображениями и управляющие элементы RichTextEdit. В PowerBuilder 6 появились Internet Developer's Toolkit и библиотека PowerBuilder Foundation Class.
Компании Powersoft и Sybase прилагают все усилия для того чтобы PowerBuilder оставался ведущим продуктом на рынке систем разработки приложений для баз данных.
Отметим основные особенности PowerBuilder 6
· Удобная среда разработки.
· Быстрота разработки клиент/серверных приложений.
· Невысокие требования разработанного приложения к ресурсам компьютера;
· Поддержка распределенных приложений, включая разделяемые объекты на сервере, push - технологии и асинхронные сообщения.
· Средства для повышения производительности разработчика, в том числе совершенно новый отладчик, расширенная библиотека PowerBuilder Foundation Class (PFC), исходные коды использования API, новые средства трассировки и поддержки профилей приложений.
· Internet Developer Toolkit (IDT), позволяющий при наличии дополнительного модуля DataWindow просматривать отчеты с помощью броузера. Установив дополнительный модуль поддержки окон, вы получаете возможность запускать PowerBuilder-приложение в окне броузера. Distributed PowerBuilder и web.pb предоставляют возможность строить HTML- страницы.
· Прочие Internet-средства, такие как DataWindow HTML-генератор, режим защиты для дополнительных модулей и ActivеX, новое окно PowerBuilder ActiveX, возможность обращаться к WEB непосредственно из среды разработки PowerBuilder.
· Генератор компонентов в составе художника проектов, позволяющий на базе пользовательских классов создавать библиотеки Distributed PowerBuilder и компонентов C++. В следующих реализациях PowerBuilder будет добавлены новые генераторы для построения удаленных объектов PowerBuilder, компонентов CORBA и DCOM и Java-классов.
· Международные системы кодирования и кроссплатформенная поддержка.[1]
Язык Basic [6] вначале был разработан для создания простых программ и использовался в качестве учебного языка для изучения основ программирования с последующим переходом на более сложные и универсальные языки. Именно поэтому этот язык с ранних пор был одним из самых простых в использовании. В настоящее время последняя версия этого языка Visual Basic 6 дает возможность решать любые современные задачи разработки приложений. При этом Visual Basic 6 остался достаточно простым в освоении, став в то же время одним из самых распространенных языков программирования. В Visual Basic 6 интегрирован набор инструментов, облегчающих и ускоряющих процесс разработки готового приложения. Такая реализация языка позволяет отнести его к средствам быстрой разработки приложений. Одним из направлений развития Visual Basic является то, что этот язык стал фактическим стандартом языка для управления всеми крупномасштабными Windows-приложениями. На основе Visual Basic созданы встроенные языки макропрограммирования для различных пакетов Microsoft Office. Эти языки получили общее название Visual Basic for Application (VBA). В Office единый языковый механизм VBA используют все основные приложения: Word, Excel, PowerPoint, Access.[6]
Программный продукт Borland C++ Builder - это средство быстрого создания корпоративных информационных систем, объединившее удобства визуальной среды разработки, объектно-ориентированный подход, разнообразные возможности повторного использования кода, открытую архитектуру и высокопроизводительный компилятор языка С++, одного из самых распространенных языков программирования.[5]
Отметим основные особенности Borland C++ Builder [5]:
· удобная среда разработки;
· быстрота разработки приложений;
· высокая производительность разработанного приложения за счет получения 32-разрядного исполняемого кода с помощью оптимизирующего компилятора;
· невысокие требования разработанного приложения к ресурсам компьютера;
· возможность полного доступа к функциям операционных систем Windows;
· возможность модернизации среды разработки за счет встраивания в нее новых компонентов, инструментов;
· архитектура доступа к данным базируется на библиотеке BDE, которая обеспечивает доступ к локальным БД и к SQL-серверам;
· возможность создавать и встраивать в приложение разнообразные отчеты.
Среда Delphi обладает с одной стороны, высокой производительностью приложений благодаря созданию полностью скомпилированного кода, удобной настраиваемой средой разработки, компонентной архитектурой, позволяющей строить приложение путем сборки его из отдельных компонентов, множество которых имеет широкое распространение, а с другой стороны - возможностью доступа к разнообразным данным, начиная от плоских таблиц типа dBase и Paradox и заканчивая разнообразными серверными СУБД. Delphi представляет собой 32-разрядную рабочую среду для создания 32-разрядных приложений, которые могут исполняться под управлением Windows 95, 98 или Windows NT. В основу этого программного продукта легли концепции объектно-ориентированного программирования на базе языка Object Pascal и визуального подхода к построению приложений [4].
Язык Visual Basic является неструктурированным языком и с его помощью достаточно сложно писать серьезные прикладные программы, он обладает ограниченными возможностями. Язык С++ достаточно сложен в использовании и применяется в основном для решения задач системного программирования. Язык Delphi по мнению многих считается на сегодняшний день одним из самых распространенных средств создания приложений баз данных для корпоративных применений.
До недавнего времени для организации коллективных БД использовалась, как правило, архитектура файл-сервер. В файл-серверных БД данные располагаются на сетевом файл-сервере, который может быть доступен одновременно нескольким пользователям, поэтому к таким БД возможен многопользовательский режим доступа. Данные в БД хранятся в единственном экземпляре, а каждый клиент в каждый момент времени работает с некоторой локальной копией этих данных, причем управление данными целиком возлагается на клиентские программы. Именно они должны заботиться о синхронизации локальных копий данных на каждом клиентском месте с содержимым основной (и единственной) базы данных. В ходе эксплуатации таких систем были выявлены общие недостатки файл-серверной архитектуры, которые состоят в следующем .
Вся тяжесть вычислительной работы ложится на компьютер клиента; на рабочую станцию присылаются не только данные, необходимые конечному пользователю, но и данные, которые будут использоваться для выполнения запроса и затем будут отброшены. Объем лишней информации может быть значительно больше, чем объем информации нужной. В результате возрастает загрузка сети, и увеличиваются требования к аппаратным мощностям пользовательского компьютера.
Поскольку БД представляет собой набор файлов на сетевом сервере, доступ к таблицам регулируется только сетевой операционной системой, что делает такую БД по сути беззащитной от случайного или намеренного искажения хранящейся в ней информации, уничтожения или хищения.
Бизнес-правила в системах файл-сервер реализуются в программе клиента, что в принципе не исключает проектирование противоречащих бизнес-правил в различных программах. Смысловая целостность информации при этом может нарушаться.
Недостаточно развитый аппарат транзакций локальных СУБД служит потенциальным источником ошибок как при одновременном внесении изменений в одну и ту же запись, так и при реализации отката результатов серии объединенных по смыслу в единое целое операций над БД, когда некоторые из них завершились успешно, а некоторые - нет. Это может нарушать ссылочную и смысловую целостность БД.
Перечисленных недостатков во многом лишены СУБД, построенные по архитектуре клиент-сервер.
В архитектуре клиент-сервер между клиентом и БД появляется важное промежуточное звено - сервер БД (специальная программа, управляющая базой данных)
Клиент формирует запрос к серверу на языке запросов SQL (Structured Query Language - структурированный язык запросов), являющийся промышленным стандартом для реляционных БД. SQL-сервер обеспечивает интерпретацию запроса, его выполнение, формирование результата и выдачу этого результата клиенту. При этом ресурсы клиентского компьютера не участвуют в физическом выполнении запроса: клиентский компьютер лишь отсылает запрос к серверной БД и получает результат, после чего интерпретирует его необходимым образом и предоставляет пользователю. Так как клиентскому компьютеру посылается результат выполнения запроса, по сети передаются только те данные, которые в действительности нужны клиенту. В итоге снижается нагрузка на сеть. Кроме того, SQL-сервер, если это возможно, оптимизирует полученный запрос таким образом, чтобы он был выполнен за минимально возможное время. Все это повышает быстродействие системы и снижает время ожидания результата запроса.
При выполнении запросов сервером существенно повышается степень безопасности данных, поскольку правила целостности данных определяются на сервере и являются едиными для всех приложений, использующих эту БД. В результате исключается возможность определения противоречивых правил поддержания целостности. Мощный аппарат транзакций, поддерживаемый SQL-серверами, блокирует одновременное изменение одних и тех же данных различными пользователями и предоставляет возможность откатов к первоначальным значениям при внесении в БД изменений, закончившихся аварийно.
Данные в серверной БД обычно физически хранятся на диске в виде одного большого файла, что в сочетании с назначаемыми каждому пользователю паролями и привилегиями существенно повышает защиту данных от намеренной порчи и хищений [3].
PowerBuilder поддерживает доступ к наиболее популярным SQL-серверам баз данных - Sybase, Microsoft SQL Server, Oracle, Informix и другим, используя стандарт ODBC.
Несмотря на постоянно растущую популярность таких средств разработки, как Delphi и Visual Basic, в дипломном проекте в качестве основного инструмента разработки клиент/серверного приложения был выбран язык программирования PowerBuilder с архитектурой клиент/сервер.
Обзор этапов программирования
К основным задачам, которые должны быть решены на этом этапе, относятся:
1) разработка клиентской части программного комплекса (пользовательский интерфейс и т.д.).
2) разработка серверной части программного комплекса (триггеры, процедуры и т.д.).
Рассмотрим более подробно поставленные задачи. Каждую из них условно можно разделить на меньшие задачи. Таким образом, решение основных задач складывается из решений серии подзадач. Так как программный комплекс очень большой мы рассмотрим только некоторые из подзадач.
1.1) Регистрация в системе.
// при открытии окна считываем из файла параметры подключения к базе т.е. //имя SQL сервера, название файла базы данных, имя пользователя по //умолчанию и т.д.
sqlca.DBMS = ProfileString ("main.ini", "database", "dbms", "")
sqlca.database = ProfileString ("main.ini", "database", "database", "")
sqlca.userid = ProfileString ("main.ini", "database", "userid", "")
sqlca.logid = ProfileString ("main.ini", "database", "logid", "")
sqlca.servername = ProfileString ("main.ini", "database", "servername", "")
sqlca.dbparm = ProfileString ("main.ini", "database", "dbparm", "")
sqlca.AutoCommit = FALSE
if sqlca.logid<>"" then
sle_login_id.text=sqlca.logid
ELSE
sle_login_id.text=sqlca.userid
END IF
//после введения имени пользователя и пароля нажимаем кнопочку «ОК». Запускается процесс проверки пользователя и пароля
sqlca.logid = sle_login_id.text
sqlca.logpass = sle_password.text
sqlca.userid = sle_login_id.text
sqlca.dbpass = sle_password.text
sqlca.dbparm = ProfileString ("main.ini", "database", "dbparm", "")
sqlca.DbParm = sqlca.DBParm+";UID="+sle_login_id.text+";PWD="+sle_password.text+"'"
sqlca.DbParm = sqlca.DBParm+",ConnectOption ='SQL_DRIVER_CONNECT,SQL_DRIVER_NOPROMPT'"
connect using sqlca;
If sqlca.sqlcode <> 0 then
If sqlca.sqldbcode = -103 Then // если код ошибки = -103 это значит неверно //введено имя пользователя и пароль введены неверно. Иначе выводим //сообщение об ошибке
// функция mstop('Стоп',stop_string,StopSign!,Ok!) выводит окошко с предупреждением.
SetProfileString ("main.ini", "database", "logid",sle_login_id.Text)
// проверка на подлинность пользователя
user_id = f_get_user_id(sqlca.userid) // функция для поиска пользователя.
// Открываем основное окно программы
Open (w_katris_frame)
// закрываем окно регистрации
close(parent)
Функция f_get_user_id(sqlca.userid)
Long userid
SELECT dbo.users.user_id
INTO :userid
FROM dbo.users
WHERE (users.user_name = :user_name);
Return userid
Загружаем файл конфигураций системы.
Функция f_get_tuning
// считываем параметры системы из файла main.ini
// TUNING
sale_punkt_code = Integer(ProfileString ("main.ini", "tuning", "sale_punkt_code", "")) // считываем код пункта продажи
// INNER_TUNING
own_code = Integer(ProfileString ("main.ini", "inner_tuning", "own_code", "0"))
agent_code = Integer(ProfileString ("main.ini", "inner_tuning", "agent_code", "4"))
diller_code = Integer(ProfileString ("main.ini", "inner_tuning", "diler_code", "5"))
magazin_code = Integer(ProfileString ("main.ini", "inner_tuning", "magazin_code", "6"))
owner_code = Integer(ProfileString ("main.ini", "inner_tuning", "owner_code", "1"))
percent_bnal = Double(ProfileString ("main.ini", "operation", "percent_bnal", "0"))/100
percent_bank = Double(ProfileString ("main.ini", "operation", "percent_bank", "0"))/100
price_per_km = Double(ProfileString ("main.ini", "operation", "price_per_km", "0")) //цена за километр
percent_spc = Double(ProfileString ("main.ini", "operation", "percent_spc", "0"))/100
kbok = Double(ProfileString("main.ini", "operation", "kbok","0"))
nds = Double(ProfileString ("main.ini", "operation", "nds", "0"))/100 //процент НДС
nal_s_prod = double(ProfileString("main.ini", "operation", "nal_s_prod","0"))/100 //Процент НсП
punkt_of_outcome = Integer(ProfileString ("main.ini", "operation", "punkt_of_outcome", "1"))
contragent_of_outcome = Integer(ProfileString ("main.ini", "operation", "contragent_of_outcome", "0"))
//GOOD_TUNING
hz_code = Long(ProfileString ("main.ini", "good_tuning", "hz_code", "1"))
hz_ready_made_code = Long(ProfileString ("main.ini", "good_tuning", "hz_ready_made_code", "101"))
hz_custom_code = Long(ProfileString ("main.ini", "good_tuning", "hz_custom_code", "102"))
hz_color_level = Long(ProfileString ("main.ini", "good_tuning", "hz_color_level", "3"))
hz_height_level = Long(ProfileString ("main.ini", "good_tuning", "hz_height_level", "4"))
hz_width_level = Long(ProfileString ("main.ini", "good_tuning", "hz_width_level", "5"))
hz_dec_karniz_code = Long(ProfileString ("main.ini", "good_tuning", "hz_dec_karniz_code", "103"))
vz_code = Long(ProfileString ("main.ini", "good_tuning", "vz_code", "2"))
vz_custom_code = Long(ProfileString ("main.ini", "good_tuning", "vz_custom_code", "121"))
vz_dec_karniz_code = Long(ProfileString ("main.ini", "good_tuning", "vz_dec_karniz_code", "122"))
vz_karniz_code = Long(ProfileString ("main.ini", "good_tuning", "vz_karniz_code", "124"))
Return
Серверные процедуры
Процедура проверки и создания уровня дерева товаров
create procedure dbo.good_livel (in begindate date,in enddate date)
result(code_operation integer,sale_punkt_code integer,type_contragent_code smallint,contragent_code integer,contragent_name char(50),payment_type smallint,good_code integer,type_of_moving smallint,rur decimal(14,2),usd decimal(14,2))
begin
declare local temporary table temptab(
temp_code_operation integer null,
temp_sale_punkt_code integer null,
temp_contragent_code integer null,
temp_payment_type smallint null,
temp_number integer null,
temp_good_code integer null,
temp_type_of_moving smallint null,
temp_date_of_moving date null,
temp_rur decimal(14,2) null,
temp_usd decimal(14,2) null,
) on commit delete rows;
insert into TempTab(temp_code_operation,
temp_sale_punkt_code,
temp_contragent_code,
temp_payment_type,
temp_number,
temp_good_code,
temp_type_of_moving,
temp_date_of_moving,
temp_rur,
temp_usd)
select operation.code_operation,
operation.sale_punkt_code,
operation.contragent_code,
operation.payment_type,
good_pos.number,
good_pos.good_code,
good_position_moving.type_of_moving,
good_position_moving.date_,
get_rur(good_pos.total,good_pos.total_rur,operation.course),
good_pos.total
from dbo.good_pos
,dbo.operation
,dbo.good_position_moving
where(operation.sale_punkt_code=good_pos.sale_punkt_code)
and(operation.code_operation=good_pos.code_operation)
and(good_position_moving.sale_punkt_code=good_pos.sale_punkt_code)
and(good_position_moving.code_operation=good_pos.code_operation)
and(good_position_moving.number=good_pos.number)
and(good_pos.saled=0)
and(good_position_moving.date_ between begindate and enddate)
and(good_position_moving.date_=(select "max"(gpm.date_)
from dbo.good_position_moving as gpm
where gpm.number=good_pos.number
and gpm.code_operation=good_pos.code_operation
and gpm.sale_punkt_code=good_pos.sale_punkt_code
and gpm.date_ between begindate and enddate));
update TempTab set
TempTab.temp_type_of_moving=(select "max"(gpm.type_of_moving)
from dbo.good_position_moving as gpm
where gpm.number=TempTab.temp_number
and gpm.code_operation=TempTab.temp_code_operation
and gpm.sale_punkt_code=TempTab.temp_sale_punkt_code
and gpm.date_=TempTab.temp_date_of_moving);
insert into TempTab(temp_code_operation,
temp_sale_punkt_code,
temp_contragent_code,
temp_payment_type,
temp_number,
temp_good_code,
temp_type_of_moving,
temp_date_of_moving,
temp_rur,
temp_usd)
select operation.code_operation,
operation.sale_punkt_code,
operation.contragent_code,
operation.payment_type,
good_pos.number,
good_pos.good_code,
5,
good_pos.date_of_saling,
get_rur(good_pos.total,good_pos.total_rur,operation.course),
good_pos.total
from dbo.good_pos
,dbo.operation
where(operation.sale_punkt_code=good_pos.sale_punkt_code)
and(operation.code_operation=good_pos.code_operation)
and(good_pos.saled=1)
and(good_pos.date_of_saling between begindate and enddate);
update TempTab set temp_type_of_moving=2 where temp_type_of_moving in(3,4);
select TempTab.temp_code_operation,
TempTab.temp_sale_punkt_code,
contragent.type_contragent_code,
TempTab.temp_contragent_code,
contragent.contragent_name,
TempTab.temp_payment_type,
goodfullnameforkassa.good_code,create procedure GoodInsertLevel(in ParentID integer,in ChildID integer)
begin atomic
declare maxlevel integer;
declare newparent integer;
if not exists(select* from Good where Good.Good_Code=ParentID) then
return
end if ;
select "Max"(HLevel) into maxlevel
from Good
where(Tag1=ParentID
or Tag2=ParentID
or Tag3=ParentID
or Tag4=ParentID
or Tag5=ParentID
or Tag6=ParentID);
if maxlevel=7 then
return
end if
end if
;
if ChildID is not null then
if not exists(select* from Good where Good.Good_Code=ChildID) then
return
end if
end if
;
-- Parent e Child i?eiaaea?ao e iaiie aaoea
if(ParentID is not null) and(ChildID is not null) then
if not exists(select* from Good as Good_p,Good as Good_c
where(Good_p.Good_Code=ParentID)
and(Good_c.Good_Code=ChildID)
and(Good_p.Hlevel+1=Good_c.Hlevel)
and((Good_p.Tag1=Good_c.Tag1)
or Good_p.Tag1 is null)) then
return
end if
end if
; -- Anee Parent = Null, oi Child - yeaiaio ia?aiai o?iaiy
if(ParentID is null) and(ChildID is not null) then
if not exists(select* from Good
where Good.Good_Code=ChildID
and Good.HLevel=1) then
return
end if
;
select "Max"(HLevel) into maxlevel
from Good
where(Tag1=ChildID
or Tag2=ChildID
or Tag3=ChildID
or Tag4=ChildID
or Tag5=ChildID
or Tag6=ChildID);
if maxlevel=7 then
return
end if
end if
;
-----------------------------------------
-- UPDATE
update Good set
HLevel=0,Tag1=newparent
where HLevel=plevel+1
and Good_Code<>newparent
and(Tag1=ParentID
or Tag2=ParentID
or Tag3=ParentID
or Tag4=ParentID
or Tag5=ParentID
or Tag6=ParentID);
return
end if
else
if ChildID is not null then
-- 3-e neo?ae
-- UPDATE
update Good set
HLevel=0,Tag1=newparent
where Good_Code=ChildID;
return
end if
end if
end;
Процедура записи и редактирования товара на необходимом уровне
create procedure dbo.itogo_period(in begindate date,in enddate date) result(code_operation integer,sale_punkt_code integer,type_contragent_code smallint,contragent_code integer,contragent_name char(50),payment_type smallint,good_code integer,type_of_moving smallint,rur decimal(14,2),usd decimal(14,2))
begin
declare local temporary table temptab(
temp_code_operation integer null,
temp_sale_punkt_code integer null,
temp_contragent_code integer null,
temp_payment_type smallint null,
temp_number integer null,
temp_good_code integer null,
temp_type_of_moving smallint null,
temp_date_of_moving date null,
temp_rur decimal(14,2) null,
temp_usd decimal(14,2) null,
) on commit delete rows;
insert into TempTab(temp_code_operation,
temp_sale_punkt_code,
temp_contragent_code,
temp_payment_type,
temp_number,
temp_good_code,
temp_type_of_moving,
temp_date_of_moving,
temp_rur,
temp_usd)
select operation.code_operation,
operation.sale_punkt_code,
operation.contragent_code,
operation.payment_type,
good_pos.number,
good_pos.good_code,
good_position_moving.type_of_moving,
good_position_moving.date_,
get_rur(good_pos.total,good_pos.total_rur,operation.course),
good_pos.total
from dbo.good_pos
,dbo.operation
,dbo.good_position_moving
where(operation.sale_punkt_code=good_pos.sale_punkt_code)
and(operation.code_operation=good_pos.code_operation)
and(good_position_moving.sale_punkt_code=good_pos.sale_punkt_code)
and(good_position_moving.code_operation=good_pos.code_operation)
and(good_position_moving.number=good_pos.number)
and(good_pos.saled=0)
and(good_position_moving.date_ between begindate and enddate)
and(good_position_moving.date_=(select "max"(gpm.date_)
from dbo.good_position_moving as gpm
where gpm.number=good_pos.number
and gpm.code_operation=good_pos.code_operation
and gpm.sale_punkt_code=good_pos.sale_punkt_code
and gpm.date_ between begindate and enddate));
update TempTab set
TempTab.temp_type_of_moving=(select "max"(gpm.type_of_moving)
from dbo.good_position_moving as gpm
where gpm.number=TempTab.temp_number
and gpm.code_operation=TempTab.temp_code_operation
and gpm.sale_punkt_code=TempTab.temp_sale_punkt_code
and gpm.date_=TempTab.temp_date_of_moving);
insert into TempTab(temp_code_operation,
temp_sale_punkt_code,
temp_contragent_code,
temp_payment_type,
temp_number,
temp_good_code,
temp_type_of_moving,
temp_date_of_moving,
temp_rur,
temp_usd)
select operation.code_operation,
operation.sale_punkt_code,
operation.contragent_code,
operation.payment_type,
good_pos.number,
good_pos.good_code,
5,
good_pos.date_of_saling,
get_rur(good_pos.total,good_pos.total_rur,operation.course),
good_pos.total
from dbo.good_pos
,dbo.operation
where(operation.sale_punkt_code=good_pos.sale_punkt_code)
and(operation.code_operation=good_pos.code_operation)
and(good_pos.saled=1)
and(good_pos.date_of_saling between begindate and enddate);
update TempTab set temp_type_of_moving=2 where temp_type_of_moving in(3,4);
select TempTab.temp_code_operation,
TempTab.temp_sale_punkt_code,
contragent.type_contragent_code,
TempTab.temp_contragent_code,
contragent.contragent_name,
TempTab.temp_payment_type,
goodfullnameforkassa.good_code,
TempTab.temp_type_of_moving,
TempTab.temp_rur,
TempTab.temp_usd
from TempTab
,dbo.goodfullnameforkassa
,dbo.good,dbo.contragent
where(contragent.contragent_code=TempTab.temp_contragent_code)
and(contragent.sale_punkt_code=TempTab.temp_sale_punkt_code)
and(good.good_code=TempTab.temp_good_code)
and(good.good_code=goodfullnameforkassa.good_code
or good.tag1=goodfullnameforkassa.good_code
or good.tag2=goodfullnameforkassa.good_code
or good.tag3=goodfullnameforkassa.good_code
or good.tag4=goodfullnameforkassa.good_code
or good.tag5=goodfullnameforkassa.good_code
or good.tag6=goodfullnameforkassa.good_code)
end;
Описание предметной области
Без информации, носителем которой являются обрабатываемые данные, невозможно существование современного человека, поэтому, её необходимо использовать как можно более эффективно. Для решения любой задачи необходимо располагать соответствующей предметно-ориентированной информацией. Для этого следует создать достоверную информационную модель, отображающую исследуемые характеристики реального мира, описываемого совокупностью конкретных и абстрактных понятий, между которыми существуют определенные связи. Реальный мир, который должен быть исследован, называют предметной областью (ПО).
В задаче, поставленной в дипломном проектировании, в качестве объекта автоматизации выступает торговая компания занимающаяся производством жалюзи.
- Клиент заполняет заказ на специальном бланке и передает этот бланк на любой из пунктов продаж.
- При получении бланка заказа от клиента, бланк проверяется и если есть какие то неясности производится отзвон клиенту и уточнение заказа.
- После этого происходит ввод заказа в систему и распечаткой необходимой документации (договор-заказ, счета и т.д.).
- После того как заказ был введен, он с помощью системы реплик передается на завод, где происходит просмотр заказов и распечаткой технологических карт, меток и другой необходимой документации.
- После того как были распечатаны все необходимые документы для производства изделия, заказ перемещается на склад производства тем самым списав те комплектующие со склада комплектующих которые необходимы для изготовления изделия.
- В течении некоторого времени заказ находится на складе производства пока не будет изготовлен.
- После изготовления изделия, заказ перемещается на склад готовой продукции, где ожидает отправки клиенту.
- При получении товара клиентом производится оплата заказа.
На всем протяжении следования заказа производится обмен репликами, как со стороны пунктов продаж, так и со стороны склада и завода. Промежутки между репликами 30 мин. Так как реплики пересылаются по электронной почте, то информация в базе обновляется очень быстро, что позволяет строить актуальные отчеты, следить за состоянием заказа, контролировать остатки на складе, и легко управлять денежными потоками.
Описание структуры базы данных
Логическая модель базы данных:
Информационная модель объекта автоматизации включает следующие объекты:
· Контрагенты;
· Товары;
· Склады;
· Пункты продаж;
· Документы ведения складского учета;
· Документы ведения кассовых операций;
Программа позволяет завести следующие виды справочников:
· Справочник пункты продаж. Пунктом продажи является салон осуществляющий торговые операции с контрагентами.
· Справочник типов пунктов продаж. Классифицирует пункты продаж (салон, магазин и т.д.).
· Справочник курсов валют. Система позволяет вести заказы по двум видам курсов валют (1. по курсу валют пункта продаж 2. по курсу валют контрагента).
· Справочник контрагентов. Контрагент - это все организации вступающие с нашей компанией в торговые отношения.
· Справочник типов контрагентов. Каждый контрагент должен иметь один из следующих статусов (дилер, клиент и т.д.).
· Справочник товары. Содержит весь список товара когда либо использовавшихся в системе.
· Справочник складов.
· Справочник единиц измерения.
Физическая модель базы данных:
Т. к. программа рассчитана на несколько различных пунктов продаж которые могут, то соответственно мы заводим справочник пунктов продаж.
В таблице sale_punkt хранится информация о пунктах продаж
Таблица № 1
Ключ |
Имя поля |
Тип поля |
Размер/вид поля |
Краткое описание поля/комментарий |
|
Да |
sale_punkt_code |
Smallint |
(от -32768 до 32767) |
Первичный ключ (Primary Key) |
|
sale_punkt_name |
Char |
50 |
Название пункта продажи |
||
id_type_sale_punkt |
Smallint |
(от -32768 до 32767) |
Тип пункта продажи |
Пункты продаж делятся на типы. К типам пунктов продаж относятся - магазины, салоны и т.д. В таблице type_sale_punkt хранится информация о типах пунктов продаж
Таблица № 2
Ключ |
Имя поля |
Тип поля |
Размер/вид поля |
Краткое описание поля/комментарий |
|
Да |
Id_type_sale_punkt |
Smallint |
(от -32768 до 32767) |
Первичный ключ (Primary Key) |
|
type_sale_punkt |
Char |
20 |
Тип пункта продажи |
Также каждый пункт продажи имеет свой курс валюты по котором он производит продажу товара. В таблице currency_course содержится информация о курсе валют по каждому пункту продажи, а также курс ЦБ.
Таблица № 3
Ключ |
Имя поля |
Тип поля |
Размер/вид поля |
Краткое описание поля/комментарий |
|
Да |
date_ |
Date |
Первичный ключ |
||
Да |
sale_punkt_code |
Smallint |
(от -32768 до 32767) |
Пункт продажи |
|
rate |
numeric |
14.2 |
Курс пункта продажи |
||
Rate_stock |
numeric |
14.2 |
Курс ЦБ |
Прай-лист пункта продажи. Каждый пункт продажи может иметь свой прайс-лист по которому происходит отпуск товара. Цены на товар в пайс-листе могут быть как рублевыми так и долларовыми.
Таблица № 4
Ключ |
Имя поля |
Тип поля |
Размер/вид поля |
Краткое описание поля/комментарий |
|
Да |
price_list_date |
Date |
Первичный ключ |
||
Да |
price_group_code |
Integer |
(от -2e31 до 2e31 - 1) |
Товар |
|
Да |
sale_punkt_code |
Smallint |
(от -32768 до 32767) |
Пункт продажи |
|
price_usd |
numeric |
(14,2) |
Цены в USD |
||
price_rur |
numeric |
(14,2) |
Цены в Рублях |
В таблице contragent содержит информация о клиентах т.е. адрес, телефоны, банковские реквизиты, ИНН и т.д. У каждого пункта продаж свои клиенты. Так же каждый контрагент имеет свой тип.
Таблица № 5
Ключ |
Имя поля |
Тип поля |
Размер/вид поля |
Краткое описание поля/комментарий |
|
Да |
contragent_code |
Integer |
(от -2e31 до 2e31 - 1) |
Первичный ключ (Primary Key) |
|
contragent_name |
Char |
50 |
Наименование контрагента |
||
sale_punkt_code |
Smallint |
(от -32768 до 32767) |
К какому пункту продаж принадлежит контрагент |
||
type_contragent_code |
Smallint |
(от -32768 до 32767) |
Тип контрагента |
||
City |
Char |
50 |
Город |
||
Telephone |
Char |
50 |
Телефон контрагента |
||
Attributes |
Char |
200 |
Банковские реквизиты |
||
Address |
Char |
50 |
Адрес контрагента |
||
Inn |
Char |
20 |
ИНН контрагента |
||
Okpo |
Char |
20 |
ОКПО контрагента |
||
Okonh |
Char |
20 |
ОКОНХ |
||
is_active |
Smallint |
1 или 0 |
Работает с нами или нет |
В таблице type_contragent хранится информация о типах контрагентов это клиент, магазин, дилер и т.д.
Таблица № 6
Ключ |
Имя поля |
Тип поля |
Размер/вид поля |
Краткое описание поля/комментарий |
|
Да |
type_contragent_code |
Smallint |
(от -32768 до 32767) |
Первичный ключ (Primary Key) |
|
type_contragent |
Char |
200 |
Тип контрагента |
В программе предусмотрена возможность каждому контрагенту присваивать курс валют, по которому пункт продаж будет работать с этим контрагентом. В таблице contragent_course хранится информация о курсе валют по каждому контрагенту
Таблица № 7
Ключ |
Имя поля |
Тип поля |
Размер/вид поля |
Краткое описание поля/комментарий |
|
Да |
date_ |
Date |
Первичный ключ |
||
Да |
sale_punkt_code |
Smallint |
(от -32768 до 32767) |
Пункт продажи |
|
Да |
contragent_code |
Smallint |
(от -32768 до 32767) |
Контрагент |
|
Rate |
numeric |
(14,2) |
Курс контагента |
Таблица good содержит список товаров и услуг.
Таблица № 8
Ключ |
Имя поля |
Тип поля |
Размер/вид поля |
Краткое описание поля/комментарий |
|
Да |
good_code_ |
Integer |
(от -2e31 до 2e31 - 1) |
Первичный ключ |
|
hlevel |
Smallint |
(от -32768 до 32767) |
Уровень дерева товаров |
||
mm_code |
Integer |
(от -2e31 до 2e31 - 1) |
Единицы измерения |
||
good_sname |
Char |
6 |
Краткое наименование товара |
||
article |
Char |
50 |
Артикул товара |
||
good_name |
Char |
50 |
Полное наименование |
||
good_integer |
Integer |
(от -2e31 до 2e31 - 1) |
Внутренний номер |
||
Okdp |
Char |
9 |
Прай-лист контрагента discount_diler. Каждый контрагент может иметь свой прайс-лист по которому происходит отпуск товара. Цены на товар в пайс-листе могут быть как рублевыми так и долларовыми.
Таблица № 9
Ключ |
Имя поля |
Тип поля |
Размер/вид поля |
Краткое описание поля/комментарий |
|
Да |
date_ |
Date |
Первичный ключ |
||
Да |
contragent_code |
Integer |
(от -2e31 до 2e31 - 1) |
Контрагент |
|
Да |
sale_punkt_code |
Smallint |
(от -32768 до 32767) |
Пункт продажи |
|
Да |
price_group_code |
Integer |
(от -2e31 до 2e31 - 1) |
Товар |
|
price_usd |
numeric |
(14,2) |
Цены в USD |
||
price_rur |
numeric |
(14,2) |
Цены в Рублях |
Таблица measurement предназначена для хранения единиц измерения.
Таблица № 10
Ключ |
Имя поля |
Тип поля |
Размер/вид поля |
Краткое описание поля/комментарий |
|
Да |
mm_code |
Integer |
(от -2e31 до 2e31 - 1) |
Первичный ключ |
|
mm_name |
Char |
50 |
Полное наименование |
||
mm_short_name |
Char |
5 |
Краткое название |
Таблица складов sclad. Склад содержит список товаров. Товар должен находиться на каком ни будь из складов.
Таблица № 11
Ключ |
Имя поля |
Тип поля |
Размер/вид поля |
Краткое описание поля/комментарий |
|
Да |
sclad_code |
Integer |
(от -2e31 до 2e31 - 1) |
Код склада (Первичный ключ) |
|
sclad_name |
Char |
50 |
Наименование склада |
Таблица operation предназначена для хранения шапки заказа. В шапке заказа вводится клиент, вид продажи, тип оплаты и т.д.
Таблица № 12
Ключ |
Имя поля |
Тип поля |
Размер/вид поля |
Краткое описание поля/комментарий |
|
Да |
code_operation |
Integer |
(от -2e31 до 2e31 - 1) |
Номер операции (первичный ключ ) |
|
sale_punkt_code |
Smallint |
(от -32768 до 32767) |
Пункт продажи |
||
sale_type_code |
Smallint |
(от -32768 до 32767) |
Вид продажи (продажа, подарок, возврат, замена и т.д.) |
||
order_number |
Smallint |
(от -32768 до 32767) |
Номер заказа |
||
order_date |
Date |
Дата заказа |
|||
contragent_code |
Integer |
(от -2e31 до 2e31 - 1) |
Контрагент |
||
performer |
Char |
50 |
Заказчик |
||
performer phone |
Char |
30 |
Телефоны заказчика |
||
Address |
Char |
100 |
Адрес заказчика |
||
Inn |
Char |
20 |
ИНН заказчика |
||
Okpo |
Char |
20 |
ОКПО |
||
installation price |
Numeric |
(14,2) |
Стоимость установки |
||
Okonh |
Char |
20 |
ОКОНХ |
||
сourse |
Numeric |
(14,2) |
Курс |
||
Saled |
Smallint |
(от -32768 до 32767) |
Состояние заказа (продано, не продано, аннулировано) |
||
acsessories |
Char |
120 |
Реквизиты заказчика |
||
date_of_sale |
Date |
Дата продажи |
|||
payment_type |
Smallint |
(от -32768 до 32767) |
Тип оплаты (НАЛ, БЕЗНАЛ) |
||
paytment_term |
Date |
Дата оплаты |
|||
name |
Char |
15 |
Фамилия менеджера ответственного за заказ |
||
user_id |
Smallint |
(от -32768 до 32767) |
Имя пользователя работающего в системе |
||
schet_opl |
Smallint |
(от -32768 до 32767) |
Оплата счета (не оплачено, платежка, полчено) |
||
km |
Smallint |
(от -32768 до 32767) |
Километраж от МКАД (связанно с ценой на доставку) |
||
dostavka |
Numeric |
(14,2) |
Стоимость доставки |
||
factura_number |
Char |
12 |
Номер Счет фактуры |
||
factura_date |
Date |
Дата выписки Счет фактуры |
|||
contragent_of_outcome |
Integer |
(от -2e31 до 2e31 - 1) |
Пункт получения |
||
metro |
Char |
50 |
Станция метро |
После того как шапка заказа была заполнена необходимо ввести товарные позиции.
Таблица good_pos предназначена для хранения товарных позиций.
Таблица № 13
Ключ |
Имя поля |
Тип поля |
Размер/вид поля |
Краткое описание поля/комментарий |
|
Да |
number |
Integer |
(от -2e31 до 2e31 - 1) |
Номер позиции |
|
Да |
code_operation |
Integer |
(от -2e31 до 2e31 - 1) |
Код операции |
|
Да |
good_code |
Integer |
(от -2e31 до 2e31 - 1) |
Товар |
|
sale_punkt_code |
Smallint |
(от -32768 до 32767) |
Пункт продажи |
||
width |
Smallint |
(от -32768 до 32767) |
Ширина |
||
height |
Smallint |
(от -32768 до 32767) |
Высота |
||
items |
Double |
Количество |
|||
price_per_item_usd |
Numeric |
(14,2) |
Цена в USD |
||
total |
Numeric |
(14,2) |
Итого |
||
date_of_production |
Date |
Дата изготовления |
|||
date_of_saling |
Date |
Дата продажи |
|||
installation |
Smallint |
(от -32768 до 32767) |
Установка |
||
amount_in_units |
Double |
Количество в ед. |
|||
installation_price |
Numeric |
(14,2) |
Стоимость установки |
||
horizontal_z_geometry_code |
Smallint |
(от -32768 до 32767) |
Геометрия |
||
horizontal_z_control_side |
Char |
5 |
Управление левое правое |
||
remake |
Smallint |
(от -32768 до 32767) |
Исправление |
||
price_per_item_rur |
Numeric |
(14,2) |
Цена в руб. |
||
total_rur |
Numeric |
(14,2) |
Итого в руб. |
||
installation_price_rur |
Numeric |
(14,2) |
Цена установки в руб. |
||
date_of_installation |
Date |
Дата установки |
Таблица payment. Оплаты. В таблице хранятся данные о клиентских оплатах по заказам .
Таблица № 14
Ключ |
Имя поля |
Тип поля |
Размер/вид поля |
Краткое описание поля/комментарий |
|
Да |
Number_operation |
Smallint |
(от -32768 до 32767) |
Номер операции (первичный ключ) |
|
Date_ |
Date |
Дата операции |
|||
code_operation |
Integer |
(от -2e31 до 2e31 - 1) |
Код операции |
||
payment_type |
Smallint |
(от -32768 до 32767) |
Тип оплаты |
||
summa_usd |
Numeric |
(14,2) |
Сумма в USD |
||
sale_punkt_code |
Smallint |
(от -32768 до 32767) |
Пункт продажи |
||
summa_rur |
Numeric |
(14,2) |
Сумма в руб. |
||
total_usd |
Numeric |
(14,2) |
Итого в USD |
||
course |
Numeric |
(14,2) |
Курс валют |
||
total_rur |
Numeric |
(14,2) |
Итого в руб. |
Описание функциональной структуры программного комплекса
В разработанном программном продукте по ведению, бухгалтерского и оперативного учета реализованы следующие функции:
Заведение и обработка заказов;
Кассовые документы (приход, расход денежных средств);
Складские документы (приход, перемещение, списание);
Формирования соответствующих отчетов;
В составе программного комплекса ведутся следующие справочники:
Справочник пунктов продаж;
Справочник типов пунктов продаж;
Справочник курсов валют;
Справочник контрагентов;
Справочник типы контрагентов;
Справочник товары.
Справочник складов.
Справочник единиц измерения
Весь программный комплекс состоит из четырех программных модулей: main.pbl, katr_prn.pbl, library.pbl, katr_com.pbl, Рассмотрим поподробнее каждый из модулей.
Модуль main.pbl - выполняет все основные функции по ведению справочной информации такие как ввод и редактирование информации в справочниках, а так же ведению как складских (приход, перемещение, списание), кассовых (приход, расход и т.д.) документов так и документов по заведение и обработке заказов.
Модуль katr_prn.pbl - выполняет функции по формирования печатных форм. В модуле хранятся шаблоны для печати нормативных документов таких как счет, счет фактура, накладные, кассовый ордер, договор заказ и т.д. Шаблоны для печати информации по справочникам такие как «Печать прайс-листов» «Печать товаров» и т.д. Так же хранятся шаблоны заводских отчетов таких как: «Заявка на завод», «Технологические карты», «Метки», складских отчетов таких как: «Остатки по складу», «Движению товаров по складам» и т.д., бухгалтерских отчетов таких как: «Доходы и расходы за день», «Товарный баланс дилера» и т.д.
Модуль library.pbl - модуль стандартных элементов. В модуле реализованы стандартные функции такие как: название месяца прописью, сумма словами, расчет НДС и НП и т.д. А также формы которые используются много раз, такие как форма для предварительного просмотра печатного листа, формы для вывода сообщения в случае ошибки и т.д.
Главное и одно из основных средств доступа к документам, меню, реализовано в модуле katr_com.pbl. Так же в модуле реализован другой не менее важный навигационный элемент - это панель инструментов (Toolbar). Модуль выполняет функции контролера за операциями регистрации в системе и назначением прав доступа к системе.
Тексты программ приведены в приложении 2.
Обзор этапов программирования
К основным задачам, которые должны быть решены на этом этапе, относятся:
2) разработка клиентской части программного комплекса (пользовательский интерфейс и т.д.).
2) разработка серверной части программного комплекса (триггеры, процедуры и т.д.).
Рассмотрим более подробно поставленные задачи. Каждую из них условно можно разделить на меньшие задачи. Таким образом, решение основных задач складывается из решений серии подзадач. Так как программный комплекс очень большой мы рассмотрим только некоторые из подзадач.
1.2) Регистрация в системе.
// при открытии окна считываем из файла параметры подключения к базе т.е. //имя SQL сервера, название файла базы данных, имя пользователя по //умолчанию и т.д.
sqlca.DBMS = ProfileString ("main.ini", "database", "dbms", "")
sqlca.database = ProfileString ("main.ini", "database", "database", "")
sqlca.userid = ProfileString ("main.ini", "database", "userid", "")
sqlca.logid = ProfileString ("main.ini", "database", "logid", "")
sqlca.servername = ProfileString ("main.ini", "database", "servername", "")
sqlca.dbparm = ProfileString ("main.ini", "database", "dbparm", "")
sqlca.AutoCommit = FALSE
if sqlca.logid<>"" then
sle_login_id.text=sqlca.logid
ELSE
sle_login_id.text=sqlca.userid
END IF
//после введения имени пользователя и пароля нажимаем кнопочку «ОК». Запускается процесс проверки пользователя и пароля
sqlca.logid = sle_login_id.text
sqlca.logpass = sle_password.text
sqlca.userid = sle_login_id.text
sqlca.dbpass = sle_password.text
sqlca.dbparm = ProfileString ("main.ini", "database", "dbparm", "")
sqlca.DbParm = sqlca.DBParm+";UID="+sle_login_id.text+";PWD="+sle_password.text+"'"
sqlca.DbParm = sqlca.DBParm+",ConnectOption = 'SQL_DRIVER_CONNECT,SQL_DRIVER_NOPROMPT'"
connect using sqlca;
If sqlca.sqlcode <> 0 then
If sqlca.sqldbcode = -103 Then // если код ошибки = -103 это значит неверно //введено имя пользователя и пароль введены неверно. Иначе выводим //сообщение об ошибке
// функция mstop('Стоп',stop_string,StopSign!,Ok!) выводит окошко с предупреждением.
SetProfileString ("main.ini", "database", "logid",sle_login_id.Text)
// проверка на подлинность пользователя
user_id = f_get_user_id(sqlca.userid) // функция для поиска пользователя.
If user_id = 0 or IsNull(user_id) Then
Открываем основное окно программы
Open (w_katris_frame)
// закрываем окно регистрации
close(parent)
1.3) Загружаем файл конфигураций системы.
Функция f_get_tuning
// считываем параметры системы из файла main.ini
// TUNING
sale_punkt_code = Integer(ProfileString ("main.ini", "tuning", "sale_punkt_code", "")) // считываем код пункта продажи
// INNER_TUNING
own_code = Integer(ProfileString ("main.ini", "inner_tuning", "own_code", "0"))
agent_code = Integer(ProfileString ("main.ini", "inner_tuning", "agent_code", "4"))
diller_code = Integer(ProfileString ("main.ini", "inner_tuning", "diler_code", "5"))
magazin_code = Integer(ProfileString ("main.ini", "inner_tuning", "magazin_code", "6"))
owner_code = Integer(ProfileString ("main.ini", "inner_tuning", "owner_code", "1"))
percent_bnal = Double(ProfileString ("main.ini", "operation", "percent_bnal", "0"))/100
percent_bank = Double(ProfileString ("main.ini", "operation", "percent_bank", "0"))/100
price_per_km = Double(ProfileString ("main.ini", "operation", "price_per_km", "0")) //цена за километр
percent_spc = Double(ProfileString ("main.ini", "operation", "percent_spc", "0"))/100
kbok = Double(ProfileString("main.ini", "operation", "kbok","0"))
nds = Double(ProfileString ("main.ini", "operation", "nds", "0"))/100 //процент НДС
nal_s_prod = double(ProfileString("main.ini", "operation", "nal_s_prod","0"))/100 //Процент НсП
punkt_of_outcome = Integer(ProfileString ("main.ini", "operation", "punkt_of_outcome", "1"))
contragent_of_outcome = Integer(ProfileString ("main.ini", "operation", "contragent_of_outcome", "0"))
//GOOD_TUNING
hz_code = Long(ProfileString ("main.ini", "good_tuning", "hz_code", "1"))
hz_ready_made_code = Long(ProfileString ("main.ini", "good_tuning", "hz_ready_made_code", "101"))
hz_custom_code = Long(ProfileString ("main.ini", "good_tuning", "hz_custom_code", "102"))
hz_color_level = Long(ProfileString ("main.ini", "good_tuning", "hz_color_level", "3"))
hz_height_level = Long(ProfileString ("main.ini", "good_tuning", "hz_height_level", "4"))
hz_width_level = Long(ProfileString ("main.ini", "good_tuning", "hz_width_level", "5"))
hz_dec_karniz_code = Long(ProfileString ("main.ini", "good_tuning", "hz_dec_karniz_code", "103"))
vz_code = Long(ProfileString ("main.ini", "good_tuning", "vz_code", "2"))
vz_custom_code = Long(ProfileString ("main.ini", "good_tuning", "vz_custom_code", "121"))
vz_dec_karniz_code = Long(ProfileString ("main.ini", "good_tuning", "vz_dec_karniz_code", "122"))
vz_karniz_code = Long(ProfileString ("main.ini", "good_tuning", "vz_karniz_code", "124"))
Return
Серверные процедуры и функции.
2.1.)Функция f_get_user_id(sqlca.userid)
Long userid
SELECT dbo.users.user_id
INTO :userid
FROM dbo.users
WHERE (users.user_name = :user_name);
Return userid
2.2.) Процедура проверки и создания уровня дерева товаров
create procedure dbo.good_livel (in begindate date,in enddate date)
result(code_operation integer,sale_punkt_code integer,type_contragent_code smallint,contragent_code integer,contragent_name char(50),payment_type smallint,good_code integer,type_of_moving smallint,rur decimal(14,2),usd decimal(14,2))
begin
declare local temporary table temptab(
temp_code_operation integer null,
temp_sale_punkt_code integer null,
temp_contragent_code integer null,
temp_payment_type smallint null,
temp_number integer null,
temp_good_code integer null,
temp_type_of_moving smallint null,
temp_date_of_moving date null,
temp_rur decimal(14,2) null,
temp_usd decimal(14,2) null,
) on commit delete rows;
insert into TempTab(temp_code_operation,
temp_sale_punkt_code,
temp_contragent_code,
temp_payment_type,
temp_number,
temp_good_code,
temp_type_of_moving,
temp_date_of_moving,
temp_rur,
temp_usd)
select operation.code_operation,
operation.sale_punkt_code,
operation.contragent_code,
operation.payment_type,
good_pos.number,
good_pos.good_code,
good_position_moving.type_of_moving,
good_position_moving.date_,
get_rur(good_pos.total,good_pos.total_rur,operation.course),
good_pos.total
from dbo.good_pos
,dbo.operation
,dbo.good_position_moving
where(operation.sale_punkt_code=good_pos.sale_punkt_code)
and(operation.code_operation=good_pos.code_operation)
and(good_position_moving.sale_punkt_code=good_pos.sale_punkt_code)
and(good_position_moving.code_operation=good_pos.code_operation)
and(good_position_moving.number=good_pos.number)
and(good_pos.saled=0)
and(good_position_moving.date_ between begindate and enddate)
and(good_position_moving.date_=(select "max"(gpm.date_)
from dbo.good_position_moving as gpm
where gpm.number=good_pos.number
and gpm.code_operation=good_pos.code_operation
and gpm.sale_punkt_code=good_pos.sale_punkt_code
and gpm.date_ between begindate and enddate));
update TempTab set
TempTab.temp_type_of_moving=(select "max"(gpm.type_of_moving)
from dbo.good_position_moving as gpm
where gpm.number=TempTab.temp_number
and gpm.code_operation=TempTab.temp_code_operation
and gpm.sale_punkt_code=TempTab.temp_sale_punkt_code
Подобные документы
Описание языков программирования высокого уровня. Стандартные структуры данных, обзор принципов структурного программирования. Построение математической модели и выбор структуры данных для решения задачи. Тестирование и отладка программного кода.
курсовая работа [1,3 M], добавлен 05.12.2020Характеристика объектно-ориентированного, процедурного, функционального программирования. Выбор языка программирования для создания программного обеспечения для управления справочником "Спортсмены". Алгоритм работы приложения, пользовательский интерфейс.
курсовая работа [1,6 M], добавлен 23.02.2016Основные этапы разработки и внедрения программного обеспечения. Понятие, функции и классификация баз данных. Проектирование базы данных "Библиотека" для ведения картотеки и учета выдачи книг. Пользовательский интерфейс программы, методика ее тестирования.
дипломная работа [2,6 M], добавлен 09.06.2012Требования к пользовательскому интерфейсу программного продукта. Выбор инструментальных средств разработки программы. Описание функциональной схемы, модульной структуры, структурной схемы. Технология разработки справочной системы программного продукта.
дипломная работа [2,7 M], добавлен 12.05.2016Исследование принципов объектно-ориентированного программирования на базе языка программирования С++. Разработка программного комплекса для ведения учёта памятников города. Описание процессов сортировки, поиска, формирования статистики по памятникам.
курсовая работа [782,4 K], добавлен 26.05.2014Обоснование языка программирования Object Pascal и среды разработки Delphi. Создание интерфейса пользователя. Проектирование структуры и описание компонентов, использованных при разработке программного продукта. Составление инструкции пользователя.
курсовая работа [888,7 K], добавлен 20.05.2015Разработка информационной системы, выбор языка программирования, физическое описание базы данных, выбор типа и описание таблиц базы данных. Техническое проектирование, ограничения и значения по умолчанию, представления, хранимые процедуры и триггеры.
курсовая работа [519,8 K], добавлен 25.05.2010Разработка программного обеспечения для автоматизированной системы калибровки и поверки комплекса технических средств ПАДК "Луг-1". Аналитический обзор аналогов. Проектирование пользовательского интерфейса. Средства разработки программного обеспечения.
дипломная работа [1,4 M], добавлен 17.12.2014Общая характеристика и описание математической модели. Выбор и обоснование среды программирования, анализ входных и выходных данных. Структурное проектирование приложений и интерфейса пользователя. Реализация и оценка защитного программирования.
курсовая работа [564,9 K], добавлен 26.09.2014Теоретические основы разработки программного обеспечения. Рассмотрение языков и среды программирования. Разработка программного продукта "Справочник стран мира и городов"; описание интерфейса. Составление терминологического словаря, диаграммы модуля.
курсовая работа [1,5 M], добавлен 09.08.2015