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

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 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


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

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