Комплекс интеллектуального анализа данных

 

Оглавление


Введение

. Краткое описание комплекса

.1 Описание структуры комплекса

.2 Описание основных задач комплекса

. Выполненные задания

.1 Задание №1

.1.1 Постановка задачи

.1.2 Описание приложения

.2 Задание №2

.2.1 Постановка задачи

.2.2 Обоснование расчета вероятностей

.2.3 Описание приложения

.3 Задание №3

.3.1 Постановка задачи

.3.2 Математическая постановка задачи

.3.3 Описание приложения

.4 Задание №4

.4.1 Постановка задачи

.4.2 Описание приложения

Заключение

Приложения


Введение


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

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

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

Вот типичные задачи, которые можно решать с помощью ИАД в сфере розничной торговли:

анализ покупательской корзины (анализ сходства) предназначен для выявления товаров, которые покупатели стремятся приобретать вместе. Знание покупательской корзины необходимо для улучшения рекламы, выработки стратегии создания запасов товаров и способов их раскладки в торговых залах.

исследование временных шаблонов помогает торговым предприятиям принимать решения о создании товарных запасов. Оно дает ответы на вопросы типа "Если сегодня покупатель приобрел видеокамеру, то через какое время он вероятнее всего купит новые батарейки и пленку?"

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

1. Краткое описание комплекса


.1 Описание структуры комплекса


Общая структура комплекса представлена на рисунке 1.1.


Рисунок 1.1 - Общая структура комплекса


На технологическом сервере размещена технологическая БД Oracle и сервер Oracle. К технологическому серверу подключаются технологические рабочие места, оснащенные клиентами Oracle. Хранение временных и кумулятивных аналитических данных осуществляется в БД SQL-сервера (FireBird). В процессе работы предприятия в технологический сервер поступают данные, обрабатываемые ПО сервера анализа. ПО сервера анализа выполняет две основные функции:

обработка данных технологической БД и формирование аналитической БД;

обработка запросов от АРМ к аналитической БД.

Упрощенная структура ПО сервера анализа показана на рисунке 1.2.


Рисунок 1.2 - Упрощенная структура ПО сервера анализа

ЦУ - центр управления, ДО - диспетчер обработок


В нужное время центр управления (ЦУ) запускает диспетчер обработок (ДО). ДО последовательно просматривает список задач, выбирает из множества обработчиков нужного обработчика для каждой задачи и запускает его. ЦУ также является сервером доступа к данным для АРМ аналитика.


.2 Описание основных задач комплекса


Все задачи делятся на две группы: мониторинг и анализ.

К задачам мониторинга относятся задачи получение некоторых небольших наборов данных, дающих краткую общую характеристику некоторого фиксированного временного интервала функционирования исследуемого объекта. Имея постоянно вычисляемые показатели функционирования объекта, можно оперативно демонстрировать их пользователю с целью создания у него целостного представления об упомянутом функционировании (конкретнее, о кассовых продажах).

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

Ассоциации. Основная цель - анализ товаров, покупаемых совместно. Т.е. по данным за некоторый период вычисляется: количество фактов совместной продажи ассоциации товаров и объемы товаров в ассоциации на факт (среднее, минимум, максимум).

Последовательности. Основная цель - анализ изменения покупаемости товара после введения скидки. Анализ изменений покупаемости товара в результате введения скидки проводится главным образом в результате сравнения ее (покупаемости) в аналогичные временные промежутки до и после введения скидки.

Кластеризация. Основная цель - распознавание кластеров покупателей. У каждого чека (покупателя) выделяются некоторые признаки - в первую очередь общая сумма чека, количество позиций чека, группы купленных товаров. Производится калибровка и нормировка признаков.

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

2. Выполненные задания


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


.1 Задание №1


.1.1 Постановка задачи

Необходимо выявить частоту появления ассоциаций.

Порядок решения задачи:

Использовать таблицу дневных ассоциаций мощностью 2 и таблицу дневных продаж товаров.

Сформировать в отдельной БД Firebirb таблицу следующей структуры: <Артикул1, Атрикул2, МестоХранения, НачДата, КонДата, Процент1, Процент2, Процент3, Процент4, Процент5, Процент6>.

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

Реализовать программное средство визуализации результатов обработки. Его функции: просмотр пар товаров с процентом, входящим в задаваемые границы. Две основные формы отображения: диаграмма процентов по парам товаров; диаграмма процентов по парным товарам для заданного товара. В обоих случаях отображать интервал дат, за который имеются данные. Для товара (пары) отображать: артикулы, наименования, диапазоны дат пары.


.1.2 Описание приложения

Согласно поставленной задаче был написан скрипт для создания базы данных и таблицы. Текс скрипта приведен в приложении А. Листинг программы приведен в приложении Б. Далее на рисунках 2.1 и 2.2 представлены экранные формы визуализатора результатов обработки. На рисунке 2.3 представлена форма обработчика.


Рисунок 2.1 - Форма диаграммы процентов по парам товаров


Рисунок 2.2 - Форма диаграммы процентов по парам товаров для заданного товара

Рисунок 2.3 - Форма обработчика

интеллектуальный анализ ассоциация

2.2 Задание №2


.2.1 Постановка задачи

Исследовать стационарность ассоциации товара А с товаром В (найти условные вероятности), т.е. как велика доля продаж, совместных с товаром В среди всех продаж товара А, а также как велика доля продаж без товара В среди всех продаж товара А.

Порядок решения задачи:

Из аналитической БД использовать таблицу дневных ассоциаций товаров мощностью 2.

Из технологической БД использовать таблицы чеков, позиций чеков, номенклатуры и классификаторов.

Сформировать в отдельной БД Firebirb таблицу следующей структуры: <Артикул1, Атрикул2, МестоХранения, НачДата, КонДата, Процент1, Процент2, Процент3, Процент4, Процент5, Процент6>.

При каждом запуске программа должна получать отсортированные пары артикулов из своей таблицы и из таблицы дневных ассоциаций за весь имеющийся период, находить необработанную пару и обрабатывать, начиная с нее. При этом по таблицам чеков и позиций чеков нужно находить общее количество чеков и количества фактов продаж каждого из этих товаров. Отношение количества совместных продаж к количеству продаж товара А фиксируем как Процетн2, к количеству продаж товара В - как Процент3, максимальную из этих величин - как Процент4; отношение количества продаж товара А без товара В к количеству чеков без товара В фиксируем как Процент5, отношение количества продаж товара В без товара А к количеству чеков без товара А фиксируем как Процент6.

Необходимо устранить повторные обращения к технологической БД. Для этого организовать класс доступа к информации о количестве продаж артикула за заданный период. Обращаться к классу по артикулу и идентификатору места хранения, получать количество, механизм получения скрыт в классе. В классе реализовать список структур «артикул-количество», и при поиске количества для артикула обращаться сначала к нему, и только в случае отсутствия артикула в списке обращаться к БД.

Реализовать программное средство визуализации результатов обработки. Его функции: просмотр пар товаров, с процентом Процент4, превышающим задаваемый предел.

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


.2.2 Обоснование расчета вероятностей

Формула вероятности покупки товара А с товаром В:


,


где - вероятность покупки товара А при покупке товара В,

- вероятность покупки товара В.

Из формулы (1) следуют следующие равенства:


где - количество продаж товара А с товаром В,

- количество продаж товара В,

- общее количество чеков.

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



.2.3 Описание приложения

Текст скрипта для создания базы данных и таблицы аналогичен предыдущей задаче и представлен в приложении А. Обработка данных в приложении выделена в отдельный поток, запускаемый из формы обработчика. Листинг программы представлен в приложении В. На рисунках 2.4 и 2.5 представлены экранные формы визуализатора результатов обработки. На рисунке 2.6 представлена форма обработчика.


Рисунок 2.4 - Форма диаграммы процентов по парам товаров


Рисунок 2.5 - Форма диаграммы процентов по парам товаров для заданного товара


Рисунок 2.6 - Форма обработчика


.3 Задание №3


.3.1 Постановка задачи

Оценить стационарность ассоциации как таковой. Т.е. брать задаваемый период и смотреть, насколько стабильно ее количество по дням. Для каждой ассоциации за заданный период находится среднее значение, дисперсия (средняя сумма квадратов отклонений от среднего), СКО (корень из дисперсии), отношение среднего к СКО и отношение среднего к СКО, умноженное на сумму средних стоимостей товаров ассоциации. Для хранения полученных показателей создать отдельную таблицу.

При вычислении последнего показателя используются средние стоимости товаров, вычисляемые из результатов задания №4. Этот показатель был добавлен после выполнения задания №4.

.3.2 Математическая постановка задачи

Математическое ожидание (среднее значение):


,


где n - количество дней в заданном периоде,- количество продаж ассоциации в i-ый день.

Дисперсия (средняя сумма квадратов отклонений от среднего):


.


Среднеквадратическое отклонение (СКО):


.


Отношение среднего к СКО:


.


Отношение среднего к СКО, умноженное на сумму средних стоимостей товаров ассоциации:


,


где SA - средняя стоимость товара А,В - средняя стоимость товара В.


.3.3 Описание приложения

Текст скрипта для создания таблицы приведен в приложении Г. В процессе реализации приложения были разработаны три метода вычисления заданных показателей. Это сделано для нахождения наиболее оптимального по времени метода. Методы отличаются способами выборки данных для расчета дисперсии, которые значительно влияют на скорость выполнения обработки. Все методы реализованы в отдельных потоках, запускаемых из формы обработки. Листинг программы представлен в приложении Д. На рисунке 2.7 представлена форма обработчика до запуска обработки, на рисунке 2.8 - после запуска обработки.


Рисунок 2.7 - Форма обработчика до запуска обработки


Рисунок 2.8 - Форма обработчика после запуска обработки


.4 Задание №4


.4.1 Постановка задачи

Ввести в результаты анализа ассоциаций количественно-суммовое наполнение.

Порядок решения задачи:

Сформировать таблицу, подчиненную для таблицы дневных ассоциаций (связанную с ней по ее первичному ключу). В этой таблице для каждой ассоциации будет: среднее количество товара А при покупке ассоциации, среднее количество товара В при покупке ассоциации, средняя стоимость товара А при покупке ассоциации, средняя стоимость товара В при покупке ассоциации, среднее количество товара А при покупке вне ассоциации, среднее количество товара В при покупке вне ассоциации, средняя стоимость товара А при покупке вне ассоциации, средняя стоимость товара В при покупке вне ассоциации.

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

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

При формировании массива все чеки будут обрабатываться последовательно, и в массивах по каждому артикулу чеки будут располагаться тоже последовательно, что облегчит их последующую обработку. (Здесь следует учесть случаи многократного вхождения артикула в чек). Главный массив с артикулами и указателями после окончания его формирования следует пересортировать по порядку артикулов, что позволит облегчить поиск артикула в нем при обработке.

При обработке на каждой итерации находить в большом массиве пару артикулов, соответствующих ассоциации, и проходить одновременно по их массивам с описаниями их вхождений в чеки.

При расчете средней стоимости и количества нужно поставить защиту от равенства нулю количества соответствующих чеков (чтобы не делить на ноль).


.4.2 Описание приложения

Текст скрипта для создания таблицы приведен в приложении Ж. Листинг программы представлен в приложении И. На рисунке 2.9 представлена форма обработчика до запуска обработки, на рисунке 2.10 - после запуска обработки.


Рисунок 2.9 - Форма обработчика до запуска обработки


Рисунок 2.10 - Форма обработчика после запуска обработки


Заключение


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

Место прохождения производственной практики будет рассматриваться как возможное место прохождения преддипломной практики.


Приложение А


Скрипт для создания базы данных и таблиц задачи 1

SQL DIALECT 3;DATABASE "C:\TEST.gdb""SYSDBA" PASSWORD "masterkey"_SIZE 8192;TABLE TEST

(ID INTEGER NOT NULL, CHAR(8) NOT NULL,CHAR(8) NOT NULL,INTEGER NOT NULL,TIMESTAMP NOT NULL,TIMESTAMP NOT NULL,FLOAT,FLOAT,FLOAT,FLOAT,FLOAT,FLOAT,PK PRIMARY KEY(ID));;GENERATOR TEST_G;;TERM ^;TRIGGER TEST_T FOR TESTBEFORE INSERT POSITION 0BEGIN(NEW.ID IS NULL) THEN.ID = GEN_ID(TEST_G,1);^TERM;^;


Приложение Б


Листинг программы задачи 1


Заголовочный файл модуля визуализации Visual.h:

#ifndef VisualH

#define VisualH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include "FIBDatabase.hpp"

#include "FIBDataSet.hpp"

#include "pFIBDatabase.hpp"

#include "pFIBDataSet.hpp"

#include <Chart.hpp>

#include <ComCtrls.hpp>

#include <DB.hpp>

#include <ExtCtrls.hpp>

#include <TabNotBk.hpp>

#include <TeEngine.hpp>

#include <TeeProcs.hpp>

#include "Test.h"

#include <Series.hpp>

#include "CGAUGES.h"

//---------------------------------------------------------------------------TForm2: public TForm

{__published:// IDE-managed Components*pFIBDatabase1;*pFIBTransaction1;*pFIBDataSet1;*TabbedNotebook1;*Chart1;*Series1;*pFIBTransaction2;*pFIBDatabase2;*GroupBox2;*Label3;*Label5;*Label6;*Button4;*Button6;*Edit3;*GroupBox1;*Label1;*Label2;*Edit1;*UpDown1;*Edit2;*UpDown2;*Button1;*Button2;*Chart2;*BarSeries1;*GroupBox3;*Label4;*Edit4;*Label7;*Edit5;*CGauge1;*Button3;__fastcall Button2Click(TObject *Sender);__fastcall Button1Click(TObject *Sender);__fastcall Button6Click(TObject *Sender);__fastcall Button4Click(TObject *Sender);__fastcall Edit3Exit(TObject *Sender);__fastcall Edit3KeyDown(TObject *Sender, WORD &Key,Shift);__fastcall TabbedNotebook1Change(TObject *Sender, int NewTab,&AllowChange);__fastcall Button3Click(TObject *Sender);:// User declarations:// User declarations*Chart;

__fastcall TForm2(TComponent* Owner);};

//---------------------------------------------------------------------------PACKAGE TForm2 *Form2;

//---------------------------------------------------------------------------

#endif


Файл реализации модуля визуализации Visual.cpp:


#include <vcl.h>

#pragma hdrstop

#include "Visual.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma link "FIBDatabase"

#pragma link "FIBDataSet"

#pragma link "pFIBDatabase"

#pragma link "pFIBDataSet"

#pragma link "CGAUGES"

#pragma resource "*.dfm"*Form2;

//---------------------------------------------------------------------------

__fastcall TForm2::TForm2(TComponent* Owner)

: TForm(Owner)

{ Chart = Chart1;}

//---------------------------------------------------------------------------__fastcall TForm2::Button2Click(TObject *Sender)

{ Form1->Show();}

//---------------------------------------------------------------------------__fastcall TForm2::Button1Click(TObject *Sender)

{AnsiString Name1,Name2;Ar1[8],Ar2[8];D1,D2,MaxD,MinD;i=1;->Active = false;->SQLs->SelectSQL->Clear();->SQLs->SelectSQL->Add("SELECT ARTICLE1,ARTICLE2,FIRSTDATE,LASTDATE,P1 FROM TEST WHERE P1>="+AnsiString("'")+Edit1->Text+"'"+" AND P1<="+"'"+Edit2->Text+"'" + " ORDER BY P1 DESC");->Open();->Open();->Active = true;->First();->Clear();= VarToDateTime(pFIBDatabase1->QueryValue("SELECT MIN(FIRSTDATE) FROM TEST",0));= VarToDateTime(pFIBDatabase1->QueryValue("SELECT MAX(LASTDATE) FROM TEST",0));->MaxValue = pFIBDataSet1->RecordCountFromSrv();->Title->Text->Clear();->Title->Text->Add("Пары товаров от "+MinD.DateString()+" до "+MaxD.DateString()+" (диапазон процентов: от "+Edit1->Text+" до "+Edit2->Text+")");->Visible = false;->Visible = false; ->Visible = false;->Visible = false;->Visible = false;->Visible = true;(!pFIBDataSet1->Eof)

{pFIBDataSet1->GetFieldData(1,Ar1);->GetFieldData(2,Ar2);= pFIBDatabase2->QueryValueAsStr("SELECT NAME FROM GOODS WHERE ARTICLE=" + AnsiString("'")+AnsiString(Ar1)+"'",0);= pFIBDatabase2->QueryValueAsStr("SELECT NAME FROM GOODS WHERE ARTICLE="+AnsiString("'")+AnsiString(Ar2)+"'",0);= VarToDateTime(pFIBDataSet1->RecordFieldValue(pFIBDataSet1->FieldByFieldNo(3),i));= VarToDateTime(pFIBDataSet1->RecordFieldValue(pFIBDataSet1->FieldByFieldNo(4),i));->AddBar(pFIBDataSet1->RecordFieldValue(pFIBDataSet1->FieldByFieldNo(5),i),Name1+"("+AnsiString(Ar1)+") "+Name2+"("+AnsiString(Ar2)+") "+D1.DateString()+"-"+D2.DateString(),clTeeColor);->Next();->Progress++;++;}->Active = false;->Close();->Close();->Enabled = true;->Enabled = true;->Enabled = true;->Text = "1";->Caption = IntToStr(Chart1->NumPages());->Visible = true;->Visible = true;->Visible = true;->Visible = true;->Visible = true;->Visible = false;->Progress = 0;}

//---------------------------------------------------------------------------__fastcall TForm2::Button6Click(TObject *Sender)

{ Chart->NextPage();(StrToInt(Edit3->Text) < Chart->NumPages())->Text = IntToStr(StrToInt(Edit3->Text)+1);}

//---------------------------------------------------------------------------__fastcall TForm2::Button4Click(TObject *Sender)

{Chart->PreviousPage();(StrToInt(Edit3->Text)>1)->Text = IntToStr(StrToInt(Edit3->Text)-1);}

//---------------------------------------------------------------------------__fastcall TForm2::Edit3Exit(TObject *Sender)

{if(StrToInt(Edit3->Text)>Chart->NumPages())>Page = Chart->NumPages();if(StrToInt(Edit3->Text)<1)>Page = 1;Chart->Page = StrToInt(Edit3->Text);}

//---------------------------------------------------------------------------__fastcall TForm2::Edit3KeyDown(TObject *Sender, WORD &Key,Shift)

{ if(Key == VK_RETURN)

{ if(StrToInt(Edit3->Text)>Chart->NumPages())

{Chart->Page = Chart->NumPages();->Text = StrToInt(Chart->NumPages()); }if(StrToInt(Edit3->Text)<1)

{Chart->Page = 1;->Text = "1";}Chart->Page = StrToInt(Edit3->Text);->SelectAll(); }}

//---------------------------------------------------------------------------__fastcall TForm2::TabbedNotebook1Change(TObject *Sender, int NewTab,&AllowChange)

{ if(NewTab)

{Button1->Visible = false;->Visible = true;= Chart2;->Left = 920;->Text = IntToStr(Chart2->Page);->Caption = IntToStr(Chart2->NumPages());}{ Button3->Visible = false;->Visible = true;= Chart1;->Left = 270;->Text = StrToInt(Chart1->Page);->Caption = IntToStr(Chart1->NumPages());}}

//---------------------------------------------------------------------------__fastcall TForm2::Button3Click(TObject *Sender)

{AnsiString Name;Ar[8];D1,D2,MaxD,MinD;i=1;->Open();(Edit4->Text!=""||Edit5->Text!="")

{if(Edit4->Text!="")

{Edit5->Text = VarToStr(pFIBDatabase2->QueryValue("SELECT NAME FROM GOODS WHERE ARTICLE='"+Edit4->Text+"'",0));(Edit5->Text == NULL)

{Application->MessageBox("Товар не найден!","ОШИБКА!",MB_OK); return; }}{ Edit4->Text = pFIBDatabase2->QueryValueAsStr("SELECT ARTICLE FROM GOODS WHERE NAME='"+Edit5->Text+"'",0);(Edit4->Text == NULL)

{Application->MessageBox("Товар не найден!","ОШИБКА!",MB_OK); return; }}}{Application->MessageBox("Введите артикул или наименование товара!","ОШИБКА!",MB_OK); return; }->Active = false;->SQLs->SelectSQL->Clear();->SQLs->SelectSQL->Add("SELECT ARTICLE1,ARTICLE2,FIRSTDATE,LASTDATE,P1 FROM TEST WHERE P1>="+AnsiString("'")+Edit1->Text+"'"+" AND P1<="+"'"+Edit2->Text+"'"+" AND (ARTICLE1='"+Edit4->Text+"' OR ARTICLE2='"+Edit4->Text+"')"+" ORDER BY P1 DESC");->Open();->Active = true;->First();->Clear();= VarToDateTime(pFIBDatabase1->QueryValue("SELECT MIN(FIRSTDATE) FROM TEST",0));= VarToDateTime(pFIBDatabase1->QueryValue("SELECT MAX(LASTDATE) FROM TEST",0));->MaxValue = pFIBDataSet1->RecordCountFromSrv();->Title->Text->Clear();->Title->Text->Add("Пары для "+Edit5->Text+" от "+MinD.DateString()+" до "+MaxD.DateString()+" (диапазон процентов: от "+Edit1->Text+" до "+Edit2->Text+")");->Visible = false;->Visible = false;->Visible = false;->Visible = false;->Visible = false;->Visible = true;(!pFIBDataSet1->Eof)

{ pFIBDataSet1->GetFieldData(1,Ar);(AnsiString(Ar) == Edit4->Text)->GetFieldData(2,Ar);= pFIBDatabase2->QueryValueAsStr("SELECT NAME FROM GOODS WHERE ARTICLE=" + AnsiString("'")+AnsiString(Ar)+"'",0);= VarToDateTime(pFIBDataSet1->RecordFieldValue(pFIBDataSet1->FieldByFieldNo(3),i));= VarToDateTime(pFIBDataSet1->RecordFieldValue(pFIBDataSet1->FieldByFieldNo(4),i));->AddBar(pFIBDataSet1->RecordFieldValue(pFIBDataSet1->FieldByFieldNo(5),i),Name+"("+AnsiString(Ar)+") "+D1.DateString()+"-"+D2.DateString(),clTeeColor);->Next();->Progress++;++;}->Active = false;->Close();->Close();->Enabled = true;->Enabled = true;->Enabled = true;->Text = "1";->Caption = IntToStr(Chart2->NumPages());->Visible = true;->Visible = true;->Visible = true;->Visible = true;->Visible = true;->Visible = false;->Progress = 0;}


Заголовочный файл модуля обработки Test.h


#ifndef TestH

#define TestH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include "FIBDatabase.hpp"

#include "pFIBDatabase.hpp"

#include "FIBDataSet.hpp"

#include "pFIBDataSet.hpp"

#include <DB.hpp>

#include <DBGrids.hpp>

#include <Grids.hpp>

#include "FIBQuery.hpp"

#include "pFIBQuery.hpp"

#include <ComCtrls.hpp>

#include "CGAUGES.h"

#include <Chart.hpp>

#include <DbChart.hpp>

#include <ExtCtrls.hpp>

#include <Series.hpp>

#include <TeEngine.hpp>

#include <TeeProcs.hpp>

//---------------------------------------------------------------------------TForm1: public TForm

{__published:// IDE-managed Components*pFIBDatabase2;*pFIBTransaction2;*pFIBDataSet1;*pFIBDataSet2;*Button3;*Label1;*pFIBDataSet3;*pFIBDatabase1;*pFIBTransaction1;*Label2;*GroupBox1;*RadioButton1;*RadioButton2;*ComboBox1;*Edit1;*DateTimePicker1;*Label3;*Label4;*DateTimePicker2;*UpDown1;*CGauge1;*Label5;*Button1;*GroupBox2;__fastcall Button3Click(TObject *Sender);__fastcall RadioButton1Click(TObject *Sender);__fastcall RadioButton2Click(TObject *Sender);__fastcall ComboBox1Change(TObject *Sender);__fastcall DateTimePicker1Change(TObject *Sender);__fastcall DateTimePicker2Change(TObject *Sender);__fastcall Button1Click(TObject *Sender);:// User declarations:// User declarationsDate1,Date2;

__fastcall TForm1(TComponent* Owner);};

//---------------------------------------------------------------------------PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif


Файл реализации модуля обработки Test.cpp:


#include <vcl.h>

#pragma hdrstop

#include "Test.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma link "FIBDatabase"

#pragma link "pFIBDatabase"

#pragma link "FIBDataSet"

#pragma link "pFIBDataSet"

#pragma link "FIBQuery"

#pragma link "pFIBQuery"

#pragma link "CGAUGES"

#pragma resource "*.dfm"*Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{}__fastcall TForm1::Button3Click(TObject *Sender)

{int locid,y,count1,count2,x;ar1[8], ar2[8];D1,D2;

/* y - кол-во дней в которые товары регистрировалисль в одном чеке- кол-во дней в которые товары продовались вместе- кол-во обработанных записей- общее кол-во записей- артикул1- артикул2- начальная дата- конечная дата */->Connected = true;->Connected = true;->Active = true;

//Выборка нужных записей из таблицы ASSOTIATION_2D->SQLs->SelectSQL->Clear();->SQLs->SelectSQL->Add("SELECT ARTICLE1,ARTICLE2,LOCID,COUNT(ID) FROM ASSOTIATIONS_2D WHERE SALESDATE >="+Date1+" AND SALESDATE <="+Date2+" GROUP BY ARTICLE1,ARTICLE2,LOCID ORDER BY ARTICLE1,ARTICLE2");->Active = true;= pFIBDataSet1->RecordCountFromSrv();= pFIBDataSet2->RecordCountFromSrv();->Caption = "Обработка:";->Caption = IntToStr(count1);->Refresh();->Caption = Label5->Caption + IntToStr(count2);->MaxValue = count2;->Progress = count1;->Refresh();

//Поиск необработанной записи(!pFIBDataSet1->IsEmpty())

{ TLocateOptions Opts;.Clear();<< loCaseInsensitive;locvalues[3];->Last();->GetFieldData(2,ar1);->GetFieldData(3,ar2);->GetFieldData(4,&locid);[0] = Variant(ar1);[1] = Variant(ar2);[2] = Variant(locid);(pFIBDataSet2->Locate("ARTICLE1;ARTICLE2;LOCID",VarArrayOf(locvalues,2),Opts))->Next();{Application->MessageBox("Запись не найдена!","ОШИБКА!",MB_OK); Form1->Close();}}

//Обработка(!pFIBDataSet2->Eof)

{pFIBTransaction1->StartTransaction();->GetFieldData(1,ar1);->GetFieldData(2,ar2);->GetFieldData(3,&locid);->GetFieldData(4,&y);->SQLs->SelectSQL->Clear();->SQLs->SelectSQL->Add("SELECT COUNT(ID),MIN(INTERVAL),MAX(INTERVAL) FROM SMSADMPL WHERE GOOD_ARTICLE="+AnsiString("'")+AnsiString(ar1)+"'"+" AND LOCID="+"'"+IntToStr(locid)+"'"+" AND INTERVAL >="+Date1+"AND INTERVAL <="+Date2+" AND INTERVAL=ANY(SELECT INTERVAL FROM SMSADMPL WHERE GOOD_ARTICLE="+"'"+AnsiString(ar2)+"'"+"AND LOCID="+"'"+IntToStr(locid)+"'"+")");->Active = true;->GetFieldData(1,&x);(x) { D1 = VarToDateTime(pFIBDataSet3->RecordFieldValue(pFIBDataSet3->FieldByFieldNo(2),1));= VarToDateTime(pFIBDataSet3->RecordFieldValue(pFIBDataSet3->FieldByFieldNo(3),1)); }{//!!!!Для ошибочных данных!!!!= 777;= StrToDate("07.07.2007");= StrToDate("07.07.2007");= y; } ->Active = false;->Insert();->FieldByName("ARTICLE1")->AsString = ar1;->FieldByName("ARTICLE2")->AsString = ar2;->FieldByName("LOCID")->AsInteger = locid;->FieldByName("FIRSTDATE")->AsDateTime = D1;->FieldByName("LASTDATE")->AsDateTime = D2;->FieldByName("P1")->AsFloat = (100/float(x))*y;->Post();->CommitRetaining();++;->Progress = count1;->Caption = IntToStr(count1);->Refresh();->Next();}->Connected = false;->Connected = false;->Active = false;->Active = false;->Progress = 0;->Caption = "";->Caption = "Всего записей:";}

//---------------------------------------------------------------------------__fastcall TForm1::RadioButton1Click(TObject *Sender)

{ComboBox1->Enabled = true;->Enabled = true;->Enabled = true;->Enabled = false;->Enabled = false;}

//---------------------------------------------------------------------------__fastcall TForm1::RadioButton2Click(TObject *Sender)

{ComboBox1->Enabled = false;->Enabled = false;->Enabled = false;->Enabled = true;->Enabled = true;}

//---------------------------------------------------------------------------__fastcall TForm1::ComboBox1Change(TObject *Sender)

{switch(ComboBox1->ItemIndex)

{case 0: {Date1 = "'01.03." + Edit1->Text+"'";= "'31.05." + Edit1->Text+"'";;}1: {Date1 = "'01.06." + Edit1->Text+"'";= "'31.08." + Edit1->Text+"'";;}2: {Date1 = "'01.09." + Edit1->Text+"'";= "'30.11." + Edit1->Text+"'";;}3{Date1 = "'01.12." + IntToStr(StrToInt(Edit1->Text)-1)+"'";= "'29.02." + Edit1->Text+"'";;} }}__fastcall TForm1::DateTimePicker1Change(TObject *Sender)

{ Date1 = "'"+DateToStr(DateTimePicker1->Date)+"'";}

//---------------------------------------------------------------------------__fastcall TForm1::DateTimePicker2Change(TObject *Sender)

{ Date2 = "'"+DateToStr(DateTimePicker2->Date)+"'";}

//---------------------------------------------------------------------------__fastcall TForm1::Button1Click(TObject *Sender)

{int count1;(Application->MessageBox("Все записи из тестовой таблицы будут удалены!\nВы уверены?","Подтверждение.",MB_OKCANCEL) == 1)

{ pFIBDatabase1->Connected = true;->Active = true;->Caption = "Удаление:";= pFIBDataSet1->RecordCountFromSrv();->MaxValue = count1;->Caption = Label5->Caption + IntToStr(count1);->First();->StartTransaction();(!pFIBDataSet1->Eof)

{pFIBDataSet1->Delete();->Progress++;->Caption = IntToStr(CGauge1->Progress); }>MessageBox("Все записи удалены.","Удаление.",MB_OK);->Execute("SET GENERATOR TEST_G TO 0;");->Commit();->Connected = false;->Active = false;->Progress = 0;->Caption = "";->Caption = "Всего записей:"; }}

//---------------------------------------------------------------------------


Приложение В


Листинг программы задачи 2


Заголовочный файл модуля визуализации Visual.h:

#ifndef VisualH

#define VisualH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include "FIBDatabase.hpp"

#include "FIBDataSet.hpp"

#include "pFIBDatabase.hpp"

#include "pFIBDataSet.hpp"

#include <Chart.hpp>

#include <ComCtrls.hpp>

#include <DB.hpp>

#include <ExtCtrls.hpp>

#include <TabNotBk.hpp>

#include <TeEngine.hpp>

#include <TeeProcs.hpp>

#include <Series.hpp>

#include "CGAUGES.h"

#include "Unit1.h"

#include "Oracle.hpp"

//---------------------------------------------------------------------------TForm2: public TForm

{__published:// IDE-managed Components*pFIBDatabase1;*pFIBTransaction1;*pFIBDataSet1;*TabbedNotebook1;*Chart1;*Series1;*pFIBTransaction2;*pFIBDatabase2;*GroupBox2;*Label3;*Label5;*Label6;*Button4;*Button6;*Edit3;*GroupBox1;*Label1;*Label2;*Edit1;*UpDown1;*Edit2;*UpDown2;*Button1;*Button2;*GroupBox3;*Label4;*Edit4;*Label7;*Edit5;*CGauge1;*Button3;*Series2;*Label8;*Chart2;*BarSeries1;*BarSeries2;*Label9;*GroupBox4;*Label10;*Edit6;*Button5;*Label11;*Label12;*OracleSession1;*OracleQuery1;*pFIBDatabase3;__fastcall Button2Click(TObject *Sender);__fastcall Button1Click(TObject *Sender);__fastcall Button6Click(TObject *Sender);__fastcall Button4Click(TObject *Sender);__fastcall Edit3Exit(TObject *Sender);__fastcall Edit3KeyDown(TObject *Sender, WORD &Key,Shift);__fastcall TabbedNotebook1Change(TObject *Sender, int NewTab,&AllowChange);__fastcall Button3Click(TObject *Sender);__fastcall Chart1AfterDraw(TObject *Sender);__fastcall Edit1KeyDown(TObject *Sender, WORD &Key,Shift);__fastcall Edit2KeyDown(TObject *Sender, WORD &Key,Shift);__fastcall Chart2AfterDraw(TObject *Sender);__fastcall Series1Click(TChartSeries *Sender, int ValueIndex,Button, TShiftState Shift, int X, int Y);__fastcall Series2Click(TChartSeries *Sender, int ValueIndex,Button, TShiftState Shift, int X, int Y);__fastcall Button5Click(TObject *Sender);__fastcall Edit4KeyDown(TObject *Sender, WORD &Key,Shift);:// User declarations:// User declarations*Chart;articul,data1,data2,location;

__fastcall TForm2(TComponent* Owner);};

//---------------------------------------------------------------------------PACKAGE TForm2 *Form2;

//---------------------------------------------------------------------------

#endif


Файл реализации модуля визуализации Visual.cpp


#include <vcl.h>

#pragma hdrstop

#include "Visual.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma link "FIBDatabase"

#pragma link "FIBDataSet"

#pragma link "pFIBDatabase"

#pragma link "pFIBDataSet"

#pragma link "CGAUGES"

#pragma link "Oracle"

#pragma resource "*.dfm"*Form2;

//---------------------------------------------------------------------------

__fastcall TForm2::TForm2(TComponent* Owner)

: TForm(Owner)

{Chart = Chart1;}

//---------------------------------------------------------------------------__fastcall TForm2::Button2Click(TObject *Sender)

{ Form1->ShowModal();}

//---------------------------------------------------------------------------__fastcall TForm2::Button1Click(TObject *Sender)

{ AnsiString Name1,Name2;Ar1[8],Ar2[8];D1,D2,MaxD,MinD;Loc;->Active = false;->SQLs->SelectSQL->Clear();->SQLs->SelectSQL->Add("SELECT ARTICLE1,ARTICLE2,LOCID,FIRSTDATE,LASTDATE,P2,P3 "

"FROM TEST "

"WHERE P4>="+Edit1->Text+" "

"AND P4<="+Edit2->Text+" "

"ORDER BY P4 DESC,ARTICLE1");->Open();->Open();->Active = true;->First();= VarToDateTime(pFIBDatabase1->QueryValue("SELECT MIN(FIRSTDATE) FROM TEST",0));= VarToDateTime(pFIBDatabase1->QueryValue("SELECT MAX(LASTDATE) FROM TEST",0));->Clear();->Clear();->Page = 1;->MaxValue = pFIBDataSet1->RecordCountFromSrv();->Caption = "Пары товаров от "+MinD.DateString()+" до "+MaxD.DateString()+" "

"(диапазон процентов: от "+Edit1->Text+" до "+Edit2->Text+")";->Visible = false;->Visible = false; ->Visible = false;->Visible = false;->Visible = false;->Visible = true;(!pFIBDataSet1->Eof)

{ pFIBDataSet1->GetFieldData(1,Ar1);->GetFieldData(2,Ar2);= pFIBDatabase2->QueryValueAsStr("SELECT NAME FROM GOODS "

"WHERE ARTICLE=\'"+AnsiString(Ar1)+"\'",0);= pFIBDatabase2->QueryValueAsStr("SELECT NAME FROM GOODS "

"WHERE ARTICLE=\'"+AnsiString(Ar2)+"\'",0);= pFIBDataSet1->FieldByName("FIRSTDATE")->AsDateTime;= pFIBDataSet1->FieldByName("LASTDATE")->AsDateTime;= pFIBDataSet1->FieldByName("LOCID")->AsInteger;->AddBar(pFIBDataSet1->FieldByName("P2")->AsFloat,Name1+"("+AnsiString(Ar1)+");"+D1.DateString()+"-"+D2.DateString(),clTeeColor);->AddBar(pFIBDataSet1->FieldByName("P3")->AsFloat,Name2+"("+AnsiString(Ar2)+");"+IntToStr(Loc),clTeeColor);->Next();->Progress++;}->Active = false;->Close();->Close();->Enabled = true;->Enabled = true;->Enabled = true;->Text = "1";->Caption = IntToStr(Chart1->NumPages());->Visible = true;->Visible = true;->Visible = true;->Visible = true;->Visible = true;->Visible = false;->Progress = 0;}

//---------------------------------------------------------------------------__fastcall TForm2::Button6Click(TObject *Sender)

{AnsiString STR;>NextPage();(StrToInt(Edit3->Text) < Chart->NumPages())->Text = IntToStr(StrToInt(Edit3->Text)+1);}

//---------------------------------------------------------------------------__fastcall TForm2::Button4Click(TObject *Sender)

{Chart->PreviousPage();(StrToInt(Edit3->Text)>1)->Text = IntToStr(StrToInt(Edit3->Text)-1);}

//---------------------------------------------------------------------------__fastcall TForm2::Edit3Exit(TObject *Sender)

{ if(StrToInt(Edit3->Text)>Chart->NumPages())>Page = Chart->NumPages();if(StrToInt(Edit3->Text)<1) Chart->Page = 1;Chart->Page = StrToInt(Edit3->Text);}

//---------------------------------------------------------------------------__fastcall TForm2::Edit3KeyDown(TObject *Sender, WORD &Key,Shift)

{ if(Key == VK_RETURN)

{if(StrToInt(Edit3->Text)>Chart->NumPages())

{Chart->Page = Chart->NumPages();->Text = StrToInt(Chart->NumPages());}if(StrToInt(Edit3->Text)<1)

{Chart->Page = 1;->Text = "1";}Chart->Page = StrToInt(Edit3->Text);->SelectAll();}}

//---------------------------------------------------------------------------__fastcall TForm2::TabbedNotebook1Change(TObject *Sender, int NewTab,&AllowChange)

{if(NewTab)

{Button1->Visible = false;->Visible = true;= Chart2;->Left = 920;->Text = IntToStr(Chart2->Page);->Caption = IntToStr(Chart2->NumPages());}{ Button3->Visible = false;->Visible = true;= Chart1;->Left = 270;->Text = StrToInt(Chart1->Page);->Caption = IntToStr(Chart1->NumPages());}}

//---------------------------------------------------------------------------__fastcall TForm2::Button3Click(TObject *Sender)

{ AnsiString Name1,Name2;Ar1[8],Ar2[8];D1,D2,MaxD,MinD;i=1,fieldnum,Loc;->Open();(Edit4->Text!=""||Edit5->Text!="")

{if(Edit4->Text!="")

{Edit5->Text = VarToStr(pFIBDatabase2->QueryValue("SELECT NAME FROM GOODS WHERE ARTICLE=\'"+Edit4->Text+"\'",0));(Edit5->Text.IsEmpty()){Application->MessageBox("Товар не найден!","ОШИБКА!",MB_OK); return; }}{Edit4->Text = pFIBDatabase2->QueryValueAsStr("SELECT ARTICLE FROM GOODS WHERE NAME=\'"+Edit5->Text+"\'",0);(Edit4->Text == NULL)

{Application->MessageBox("Товар не найден!","ОШИБКА!",MB_OK); return; }}}{Application->MessageBox("Введите артикул или наименование товара!","ОШИБКА!",MB_OK); return; }->Active = false;->SQLs->SelectSQL->Text="SELECT ARTICLE1,ARTICLE2,FIRSTDATE,LASTDATE,P2,P3,LOCID "

"FROM TEST "

"WHERE P4>=\'"+Edit1->Text+"\' AND P4<=\'"+Edit2->Text+"\' "

"AND (ARTICLE1=\'"+Edit4->Text+"\' OR ARTICLE2=\'"+Edit4->Text+"\') "

"ORDER BY P4 DESC,ARTICLE1";->Open();->Active = true;->First();->Clear();->Clear();= VarToDateTime(pFIBDatabase1->QueryValue("SELECT MIN(FIRSTDATE) FROM TEST",0));= VarToDateTime(pFIBDatabase1->QueryValue("SELECT MAX(LASTDATE) FROM TEST",0));->MaxValue = pFIBDataSet1->RecordCountFromSrv();->Caption = "Пары для "+Edit5->Text+" от "+MinD.DateString()+" до "+MaxD.DateString()+" (диапазон процентов: от "+Edit1->Text+" до "+Edit2->Text+")";->Visible = false;->Visible = false;->Visible = false;->Visible = false;->Visible = false;->Visible = true;(!pFIBDataSet1->Eof)

{ pFIBDataSet1->GetFieldData(1,Ar1);->GetFieldData(2,Ar2);= pFIBDatabase2->QueryValueAsStr("SELECT NAME FROM GOODS "

"WHERE ARTICLE=\'"+AnsiString(Ar1)+"\'",0);= pFIBDatabase2->QueryValueAsStr("SELECT NAME FROM GOODS "

"WHERE ARTICLE=\'"+AnsiString(Ar2)+"\'",0);= VarToDateTime(pFIBDataSet1->RecordFieldValue(pFIBDataSet1->FieldByFieldNo(3),i));= VarToDateTime(pFIBDataSet1->RecordFieldValue(pFIBDataSet1->FieldByFieldNo(4),i));= pFIBDataSet1->RecordFieldValue(pFIBDataSet1->FieldByFieldNo(7),i);->AddBar(pFIBDataSet1->RecordFieldValue(pFIBDataSet1->FieldByFieldNo(5),i),Name1+"("+AnsiString(Ar1)+");"+D1.DateString()+"-"+D2.DateString(),clTeeColor);->AddBar(pFIBDataSet1->RecordFieldValue(pFIBDataSet1->FieldByFieldNo(6),i),Name2+"("+AnsiString(Ar2)+");"+IntToStr(Loc),clTeeColor);->Next();->Progress++;++; }->Active = false;->Close();->Close();->Enabled = true;->Enabled = true;->Enabled = true;->Text = "1";->Caption = IntToStr(Chart2->NumPages());->Visible = true;->Visible = true;->Visible = true;->Visible = true;->Visible = true;->Visible = false;->Progress = 0;}

//---------------------------------------------------------------------------__fastcall TForm2::Chart1AfterDraw(TObject *Sender)

{AnsiString label1,label2,str1,str2,date;h,w,w1,x,y,i,n,a;->Canvas->Pen->Color = clBlack;(i = 0;i < Chart1->MaxPointsPerPage;i++)

{ n = 4*(Chart1->Page-1)+i;(Series1->Count()-n-1<0) return;= Series2->XLabel[n];= Series1->XLabel[n];= label1.AnsiPos(";");= label1.SubString(1,a-1)+" ";= label1.SubString(a+1,label1.Length());= label2.AnsiPos(";");= label2.SubString(1,a-1);= Chart1->Canvas->TextHeight(str2);= Chart1->Canvas->TextWidth(str2);= Chart1->Canvas->TextWidth(str1);= Series2->CalcXPos(n)-w-1;(x<0)x = 0;((x+w+w1+6)>Chart1->Width) x = Chart1->Width-(w+w1+6);= i*(h+8);->Canvas->Brush->Color = clYellow;->Canvas->FillRect(Rect(x,y,x+w,y+h));->Canvas->Rectangle(x,y,x+w+2,y+h+2);->Canvas->TextOutA(x+1,y+1,str1);->Canvas->Brush->Color = clLime;->Canvas->FillRect(Rect(x+w+2,y,x+w+w1+3,y+h));->Canvas->Rectangle(x+w+2,y,x+w+w1+4,y+h+2);->Canvas->TextOutA(x+w+3,y+1,str2);->Canvas->Brush->Color = clFuchsia;->Canvas->TextOutA(Series2->CalcXPos(n)-62,351,date);->Canvas->Line(Series2->CalcXPos(n),y+h+1,Series2->CalcXPos(n),353);}}

//---------------------------------------------------------------------------__fastcall TForm2::Edit1KeyDown(TObject *Sender, WORD &Key,Shift)

{if(Key == VK_RETURN)

{if(TabbedNotebook1->PageIndex)Button3->OnClick(NULL);Button1->OnClick(NULL); }}

//---------------------------------------------------------------------------__fastcall TForm2::Edit2KeyDown(TObject *Sender, WORD &Key,Shift)

{ if(Key == VK_RETURN)

{if(TabbedNotebook1->PageIndex)Button3->OnClick(NULL);Button1->OnClick(NULL); }}

//---------------------------------------------------------------------------__fastcall TForm2::Chart2AfterDraw(TObject *Sender)

{AnsiString label1,label2,str1,str2,date;h,w,w1,x,y,i,n,a;->Canvas->Pen->Color = clBlack;(i = 0;i < Chart1->MaxPointsPerPage;i++)

{ n = 4*(Chart2->Page-1)+i;(BarSeries1->Count()-n-1<0) return;= BarSeries2->XLabel[n];= BarSeries1->XLabel[n];= label1.AnsiPos(";");= label1.SubString(1,a-1)+" ";= label1.SubString(a+1,label1.Length());= label2.AnsiPos(";");= label2.SubString(1,a-1);= Chart2->Canvas->TextHeight(str2);= Chart2->Canvas->TextWidth(str2);= Chart2->Canvas->TextWidth(str1);= BarSeries2->CalcXPos(n)-w-1;(x<0)x = 0;((x+w+w1+6)>Chart2->Width) x = Chart2->Width-(w+w1+6);= i*(h+8);->Canvas->Brush->Color = clYellow;->Canvas->FillRect(Rect(x,y,x+w,y+h));->Canvas->Rectangle(x,y,x+w+2,y+h+2);->Canvas->TextOutA(x+1,y+1,str1);->Canvas->Brush->Color = clLime;->Canvas->FillRect(Rect(x+w+2,y,x+w+w1+3,y+h));->Canvas->Rectangle(x+w+2,y,x+w+w1+4,y+h+2);->Canvas->TextOutA(x+w+3,y+1,str2);->Canvas->Brush->Color = clFuchsia;->Canvas->TextOutA(BarSeries2->CalcXPos(n)-62,351,date);->Canvas->Line(BarSeries2->CalcXPos(n),y+h+1,BarSeries2->CalcXPos(n),353); }}

//---------------------------------------------------------------------------__fastcall TForm2::Series1Click(TChartSeries *Sender, int ValueIndex,Button, TShiftState Shift, int X, int Y)

{int len,p;= Series1->XLabel[ValueIndex].Length();->Caption = Series1->XLabel[ValueIndex].SubString(len-28,6);= Series1->XLabel[ValueIndex].SubString(len-20,10);= Series1->XLabel[ValueIndex].SubString(len-9,10);= Series2->XLabel[ValueIndex].Length();= Series2->XLabel[ValueIndex].AnsiPos(";");= Series2->XLabel[ValueIndex].SubString(p-7,6);= Series2->XLabel[ValueIndex].SubString(p+1,len-p);}

//---------------------------------------------------------------------------__fastcall TForm2::Series2Click(TChartSeries *Sender, int ValueIndex,Button, TShiftState Shift, int X, int Y)

{int len,p;= Series1->XLabel[ValueIndex].Length();= Series1->XLabel[ValueIndex].SubString(len-28,6);= Series1->XLabel[ValueIndex].SubString(len-20,10);= Series1->XLabel[ValueIndex].SubString(len-9,10);= Series2->XLabel[ValueIndex].Length();= Series2->XLabel[ValueIndex].AnsiPos(";");->Caption = Series2->XLabel[ValueIndex].SubString(p-7,6);= Series2->XLabel[ValueIndex].SubString(p+1,len-p);}

//---------------------------------------------------------------------------__fastcall TForm2::Button5Click(TObject *Sender)

{if(Label10->Caption.IsEmpty()) { Application->MessageBox("Выберите артикул!","Не выбраны данные.",MB_OK); }{ AnsiString Query;A;AB;= "SELECT SUM(SALESCOUNT) "

"FROM ASSOTIATIONS_2D "

"WHERE ((ARTICLE1=\'"+Label10->Caption+"\' AND ARTICLE2=\'"+articul+"\') "

"OR (ARTICLE2=\'"+Label10->Caption+"\' AND ARTICLE1=\'"+articul+"\')) "

"AND LOCID="+location+" "

"AND SALESDATE BETWEEN \'"+data1+"\' AND \'"+data2+"\'";->Open();= pFIBDatabase2->QueryValue(Query,0);->Connected = true;->SQL->Text = "SELECT COUNT(SUPERMAG.SMCASHCHECKS.CHECKNUM) "

"FROM SUPERMAG.SMCASHCHECKS,SUPERMAG.SMCASHCHECKITEMS "

"WHERE SUPERMAG.SMCASHCHECKITEMS.ARTICLE=\'"+Label10->Caption+"\' "

"AND SUPERMAG.SMCASHCHECKITEMS.LOCID="+location+" "

"AND SUPERMAG.SMCASHCHECKITEMS.CHECKNUM=SUPERMAG.SMCASHCHECKS.CHECKNUM "

"AND SUPERMAG.SMCASHCHECKITEMS.ZNUM=SUPERMAG.SMCASHCHECKS.ZNUM "

"AND SUPERMAG.SMCASHCHECKITEMS.DESKNUM=SUPERMAG.SMCASHCHECKS.DESKNUM "

"AND SUPERMAG.SMCASHCHECKS.PRINTTIME >= \'"+data1+"\' "

"AND SUPERMAG.SMCASHCHECKS.PRINTTIME <= \'"+data2+"\' ";->Execute();= OracleQuery1->FieldAsInteger(0);->Text = FloatToStr(((A-AB)/A)*100);->Connected = false;->Close(); }}

//---------------------------------------------------------------------------__fastcall TForm2::Edit4KeyDown(TObject *Sender, WORD &Key,Shift)

{ if(Key == VK_RETURN){ if(TabbedNotebook1->PageIndex)Button3->OnClick(NULL);Button1->OnClick(NULL); }

//---------------------------------------------------------------------------


Заголовочный файл модуля обработки Unit1.h


#ifndef Unit1H

#define Unit1H

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include "FIBDatabase.hpp"

#include "FIBDataSet.hpp"

#include "pFIBDatabase.hpp"

#include "pFIBDataSet.hpp"

#include <DB.hpp>

#include <ComCtrls.hpp>

#include "CGAUGES.h"

#include "Oracle.hpp"

#include "OracleData.hpp"

#include "FIBQuery.hpp"

#include "pFIBQuery.hpp"

#include "WORK.H"

//---------------------------------------------------------------------------TForm1: public TForm

{__published:// IDE-managed Components*pFIBDatabase1;*pFIBDataSet1;*pFIBTransaction1;*pFIBTransaction2;*pFIBDatabase2;*GroupBox1;*RadioButton1;*RadioButton2;*RadioButton3;*ComboBox1;*Edit1;*UpDown1;*DateTimePicker1;*DateTimePicker2;*Label1;*Label2;*Button1;*CGauge1;*Label3;*Label4;*Label5;*Label6;*OracleQuery1;*Button2;*OracleSession1;*pFIBQuery1;*pFIBDataSet2;__fastcall RadioButton1Click(TObject *Sender);__fastcall RadioButton2Click(TObject *Sender);__fastcall RadioButton3Click(TObject *Sender);__fastcall ComboBox1Change(TObject *Sender);__fastcall DateTimePicker1Change(TObject *Sender);__fastcall Button1Click(TObject *Sender);__fastcall Button2Click(TObject *Sender);:// User declarations:// User declarationsstr;D1,D2;

__fastcall TForm1(TComponent* Owner);};

//---------------------------------------------------------------------------PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif


Файл реализации модуля обработки Unit1.cpp


#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"*Obr;

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma link "FIBDatabase"

#pragma link "FIBDataSet"

#pragma link "pFIBDatabase"

#pragma link "pFIBDataSet"

#pragma link "CGAUGES"

#pragma link "Oracle"

#pragma link "OracleData"

#pragma link "FIBQuery"

#pragma link "pFIBQuery"

#pragma resource "*.dfm"*Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{ Obr = NULL;}

//---------------------------------------------------------------------------__fastcall TForm1::RadioButton1Click(TObject *Sender)

{ComboBox1->Enabled = RadioButton1->Checked;->Enabled = RadioButton1->Checked;->Enabled = RadioButton1->Checked;->Enabled = RadioButton2->Checked;->Enabled = RadioButton2->Checked;}

//---------------------------------------------------------------------------__fastcall TForm1::RadioButton2Click(TObject *Sender)

{ComboBox1->Enabled = RadioButton1->Checked;->Enabled = RadioButton1->Checked;->Enabled = RadioButton1->Checked;->Enabled = RadioButton2->Checked;->Enabled = RadioButton2->Checked;->OnChange(NULL);}

//---------------------------------------------------------------------------__fastcall TForm1::RadioButton3Click(TObject *Sender)

{ComboBox1->Enabled = false;->Enabled = false;->Enabled = false;->Enabled = false;->Enabled = false;="SELECT SUM(SALESCOUNT),ARTICLE1,ARTICLE2,LOCID "

"FROM ASSOTIATIONS_2D "

"GROUP BY ARTICLE1,ARTICLE2,LOCID "

"ORDER BY ARTICLE1,ARTICLE2";}

//---------------------------------------------------------------------------__fastcall TForm1::ComboBox1Change(TObject *Sender)

{switch(ComboBox1->ItemIndex)

{case 0:{ D1 = EncodeDate(StrToInt(Edit1->Text),3,1);= EncodeDate(StrToInt(Edit1->Text),5,31);;}1: {D1 = EncodeDate(StrToInt(Edit1->Text),6,1);= EncodeDate(StrToInt(Edit1->Text),8,31);; }2: {D1 = EncodeDate(StrToInt(Edit1->Text),9,01);= EncodeDate(StrToInt(Edit1->Text),11,30);; }3: {D1 = EncodeDate(StrToInt(Edit1->Text)-1,12,01);= EncodeDate(StrToInt(Edit1->Text),2,29);

//break; }}="SELECT SUM(SALESCOUNT),ARTICLE1,ARTICLE2,LOCID "

"FROM ASSOTIATIONS_2D "

"WHERE SALESDATE>='"+D1.DateString()+"' "

"AND SALESDATE<='"+D2.DateString()+"' "

"GROUP BY ARTICLE1,ARTICLE2,LOCID "

"ORDER BY ARTICLE1,ARTICLE2";}

//---------------------------------------------------------------------------__fastcall TForm1::DateTimePicker1Change(TObject *Sender)

{D1 = DateTimePicker1->Date;= DateTimePicker2->Date;="SELECT SUM(SALESCOUNT),ARTICLE1,ARTICLE2,LOCID "

"FROM ASSOTIATIONS_2D "

"WHERE SALESDATE>='"+DateTimePicker1->Date.DateString()+"' "

"AND SALESDATE<='"+DateTimePicker2->Date.DateString()+"' "

"GROUP BY ARTICLE1,ARTICLE2,LOCID "

"ORDER BY ARTICLE1,ARTICLE2";}

//---------------------------------------------------------------------------__fastcall TForm1::Button1Click(TObject *Sender)

{if(Button1->Caption == "Обработка")

{if(Obr!=NULL)return;->Caption = "Отмена";= new WORK(true);>FreeOnTerminate = true;>Resume();}{if(Obr==NULL)return;->Caption = "Обработка";>Terminate();}}

//---------------------------------------------------------------------------__fastcall TForm1::Button2Click(TObject *Sender)

{int count1;(Application->MessageBox("Все записи из таблицы будут удалены!\nВы уверены?","Подтверждение.",MB_OKCANCEL) == 1)

{pFIBDatabase2->Open();->Active = true;= pFIBDataSet2->RecordCountFromSrv();->MaxValue = count1;->Caption =IntToStr(count1);->First();->StartTransaction();(!pFIBDataSet2->Eof)

{pFIBDataSet2->Delete();->Progress++;->Caption = IntToStr(CGauge1->Progress);}>MessageBox("Все записи удалены.","Удаление.",MB_OK);->Execute("SET GENERATOR TEST_G TO 0;");->Commit();->Active = false;->Close();->Progress = 0;->Caption = "";->Caption = ""; }}

//---------------------------------------------------------------------------

Файл класса получения количества продаж товаров salescount.h :

#ifndef SCH

#define SCH

//---------------------------------------------------------------------------sc{ar[8];count;};

//---------------------------------------------------------------------------salescount

{public:(TOracleQuery*);

~salescount();SetDates(const TDateTime, const TDateTime);GetCount(const char*, const int,int*,int*);:**List;*ind,*cheks;//cheks - общее кол-во чеков при заданном Locidnum;*FirstD, *LastD;*Query;AddNewCounts(const int);};

//---------------------------------------------------------------------------::salescount(TOracleQuery *Q)

{Query = Q;= 0;= NULL;= NULL;= NULL;= new TDateTime;= new TDateTime;>Session->Connected = true;}

//---------------------------------------------------------------------------::~salescount()

{int i,j;(j = 0;j < num;j++)

{for(i = 0;i < List[j]->Count;i++) delete (sc *)List[j]->Items[i];List[j]; }(List)delete[] List;(ind)delete[] ind;FirstD;LastD;>Session->Connected = false;}

//---------------------------------------------------------------------------salescount::SetDates(const TDateTime D1, const TDateTime D2)

{*FirstD = D1;

*LastD = D2;

(*FirstD)-=1;

(*LastD)+=1;}

//---------------------------------------------------------------------------salescount::GetCount(const char *Art, const int Loc,int *SC,int *nSC)

{int i,index=-1;(i = 0;i <num; i++)(ind[i]==Loc) {index = i;break;}(index == -1) {AddNewCounts(Loc);= num-1; }(List[index]->Count)

{ sc *cnt;(int j = 0;j < List[index]->Count;j++)

{cnt = (sc *)List[index]->Items[j];(StrComp(cnt->ar,Art)==0)

{*SC = cnt->count;

*nSC = cheks[index]-cnt->count;;} }}

*SC = 0;

*nSC = 0;}

//---------------------------------------------------------------------------salescount::AddNewCounts(const int Loc)

{sc *cnt;**buft;*bufi,*bufc;i;++;= new TList*[num];(i = 0;i < num-1;i++) buft[i] = List[i];(List)delete[] List;= buft;[num-1] = new TList;= new int[num-1];= new int[num-1];(i = 0;i < num-1;i++) {bufi[i] = ind[i];bufc[i] = cheks[i];}(ind)delete[] ind;(cheks)delete[] cheks;= bufi;= bufc;[num-1] = Loc;[num-1] = 0;>Close();>SQL->Text = "SELECT COUNT(CH.CHECKNUM) "

"FROM SUPERMAG.SMCASHCHECKS CH "

"WHERE CH.PRINTTIME >= \'"+FirstD->DateString()+"\' "

"AND CH.PRINTTIME <= \'"+LastD->DateString()+"\' "

"AND CH.LOCID=\'"+IntToStr(Loc)+"\' ";>Execute();[num-1] = Query->FieldAsInteger(0);>Close();>SQL->Text = "SELECT CHI.ARTICLE,COUNT(CH.CHECKNUM) "

"FROM SUPERMAG.SMCASHCHECKS CH,SUPERMAG.SMCASHCHECKITEMS CHI "

"WHERE CHI.LOCID=\'"+IntToStr(Loc)+"\' "

"AND CHI.CHECKNUM=CH.CHECKNUM "

"AND CHI.ZNUM=CH.ZNUM "

"AND CHI.DESKNUM=CH.DESKNUM "

"AND CH.PRINTTIME >= \'"+FirstD->DateString()+"\' "

"AND CH.PRINTTIME <= \'"+LastD->DateString()+"\' "

"GROUP BY CHI.ARTICLE "

"ORDER BY CHI.ARTICLE";>Execute();(!Query->Eof)

{cnt = new sc;(cnt->ar,Query->FieldAsString(0).c_str());>count = Query->FieldAsInteger(1);(List[num-1]->Count == List[num-1]->Capacity) List[num-1]->Expand();[num-1]->Add(cnt);>Next();}}

//---------------------------------------------------------------------------

#endif


Заголовочный файл потока обработки WORK.h


//---------------------------------------------------------------------------

#ifndef WORKH

#define WORKH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include "Unit1.h"

#include "salescount.h"

//---------------------------------------------------------------------------WORK: public TThread

{private:locid,count1,count2,AB,A,B,nA,nB;ar1[8], ar2[8];a,b,anb,bna;snc;__fastcall Sync();:__fastcall Execute();:

__fastcall WORK(bool CreateSuspended);};

//---------------------------------------------------------------------------

#endif


Файл реализации потока обработки WORK.cpp:


#include <vcl.h>

#pragma hdrstop

#include "WORK.h"

#pragma package(smart_init)

//---------------------------------------------------------------------------

__fastcall WORK::WORK(bool CreateSuspended)

: TThread(CreateSuspended)

{}__fastcall WORK::Sync()

{ switch(snc) {0:{Form1->CGauge1->MaxValue = count2;->Label4->Caption = IntToStr(count1);->Label6->Caption = IntToStr(count2);;}1:{Form1->Label4->Caption = IntToStr(count1);->CGauge1->Progress = count1;;}2:{Application->MessageBox("Обработка завершена.","Завершение.",MB_OK);->Label4->Caption = "";->Label6->Caption = "";->CGauge1->Progress = 0;;} }}

//---------------------------------------------------------------------------__fastcall WORK::Execute()

{ /*AB - количество продаж ассоциаций за выбранный период- кол-во фактов продаж товара А

В - кол-во фактов продаж товара В- кол-во обработанных записей- общее кол-во записей- артикул1- артикул2- начальная дата- конечная дата

а - отношение кол-ва совместных продаж к кол-ву продаж товара А- отношение кол-ва совместных продаж к кол-ву продаж товара B */->pFIBDataSet1->Active = false;->pFIBDataSet1->SQLs->SelectSQL->Clear();->pFIBDataSet1->SQLs->SelectSQL->Add(Form1->str);->pFIBDatabase1->Open();->pFIBDataSet1->Active = true;->pFIBDatabase2->Open();(Form1->RadioButton3->Checked)

{Form1->D1 = VarToDateTime(Form1->pFIBDatabase1->QueryValue("SELECT MIN(SALESDATE) FROM ASSOTIATIONS_2D",0));->D2 = VarToDateTime(Form1->pFIBDatabase1->QueryValue("SELECT MAX(SALESDATE) FROM ASSOTIATIONS_2D",0));}ArtCount(Form1->OracleQuery1);.SetDates(Form1->D1, Form1->D2);= Form1->pFIBDataSet1->RecordCountFromSrv();= 0;= 0;(Sync);->pFIBDataSet1->First();(!Form1->pFIBDataSet1->Eof&&!Terminated)

{ Form1->pFIBTransaction2->StartTransaction();= Form1->pFIBDataSet1->RecordFieldValue(Form1->pFIBDataSet1->FieldByFieldNo(1),count1+1);->pFIBDataSet1->GetFieldData(2,ar1);->pFIBDataSet1->GetFieldData(3,ar2);->pFIBDataSet1->GetFieldData(4,&locid);.GetCount(ar1,locid,&A,&nA);.GetCount(ar2,locid,&B,&nB);= A - AB;//Определение кол-ва чеков A*~B= B - AB;(A&&B){ a = (double(AB)/A)*100;= (double(AB)/B)*100;= anb/nB;= bna/nA; }{ a = 777;= 777; }->pFIBQuery1->ParamByName("ARTICLE1")->AsString = ar1;->pFIBQuery1->ParamByName("ARTICLE2")->AsString = ar2;->pFIBQuery1->ParamByName("LOCID")->AsInteger = locid;->pFIBQuery1->ParamByName("FIRSTDATE")->AsDateTime = Form1->D1;->pFIBQuery1->ParamByName("LASTDATE")->AsDateTime = Form1->D2;->pFIBQuery1->ParamByName("P5")->AsFloat = anb;->pFIBQuery1->ParamByName("P6")->AsFloat = bna;->pFIBQuery1->ParamByName("P2")->AsFloat = a;->pFIBQuery1->ParamByName("P3")->AsFloat = b;(a>b) Form1->pFIBQuery1->ParamByName("P4")->AsFloat = a;Form1->pFIBQuery1->ParamByName("P4")->AsFloat = b;->pFIBQuery1->ExecQuery();->pFIBTransaction2->CommitRetaining();->pFIBDataSet1->Next();++;= 1;(Sync); }= 2;(Sync);->pFIBDataSet1->Active = false;->pFIBDatabase1->Close();->pFIBDatabase2->Close();}

//---------------------------------------------------------------------------


Приложение Г


Скрипт для создания таблицы задачи 3

SQL DIALECT 3;

/*Используется готовыя база данных с добавлением новой таблицы*/"C:\TEST.GDB""SYSDBA" PASSWORD "masterkey";TABLE Prob

(ID INTEGER NOT NULL, CHAR(8) NOT NULL,CHAR(8) NOT NULL,INTEGER NOT NULL,TIMESTAMP NOT NULL,TIMESTAMP NOT NULL,FLOAT,FLOAT,FLOAT,FLOAT, FLOAT,PK_2 PRIMARY KEY(ID));;GENERATOR Prob_G;;TERM ^;TRIGGER Prob_T FOR ProbBEFORE INSERT POSITION 0BEGIN(NEW.ID IS NULL) THEN.ID = GEN_ID(Prob_G,1);^TERM;^;


Приложение Д


Листинг программы задачи 3


Заголовочный файл модуля обработки Obrabotka.h :

#ifndef ObrabotkaH

#define ObrabotkaH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <ComCtrls.hpp>

#include "FIBDatabase.hpp"

#include "FIBDataSet.hpp"

#include "pFIBDatabase.hpp"

#include "pFIBDataSet.hpp"

#include <DateUtils.hpp>

#include "WORK.h"

#include "WORK_S2.h"

#include "WORK_S3.h"

#include "DLT.h"

#include <DB.hpp>

#include <ExtCtrls.hpp>

#include "CGAUGES.h"

#include <Graphics.hpp>

#include "FIBQuery.hpp"

#include "pFIBQuery.hpp"

//---------------------------------------------------------------------------TForm1: public TForm

{__published:// IDE-managed Components*SMSA;*pFIBTransaction1;*Sel_1;*Sel_2;*WORK_2;*pFIBTransaction2;*Panel1;*GroupBox1;*Label1;*Label2;*RadioButton1;*RadioButton2;*RadioButton3;*ComboBox1;*Edit1;*UpDown1;*DateTimePicker1;*DateTimePicker2;*Button1;*Panel2;*Bevel1;*Button2;*CGauge1;*Label3;*Label4;*Label5;*Button3;*Image1;*Label6;*Label7;*Label8;*Label9;*Label10;*Label11;*Label12;*pFIBQuery1;*Button4;*Del;*Button5;*Button6;*RadioGroup1;*Label13;*Label14;*Label15;*Label16;*Button7;__fastcall RadioButton1Click(TObject *Sender);__fastcall RadioButton2Click(TObject *Sender);__fastcall RadioButton3Click(TObject *Sender);__fastcall ComboBox1Change(TObject *Sender);__fastcall DateTimePicker1Change(TObject *Sender);__fastcall Button2Click(TObject *Sender);__fastcall Button1Click(TObject *Sender);__fastcall Button3Click(TObject *Sender);__fastcall Button4Click(TObject *Sender);__fastcall Button5Click(TObject *Sender);__fastcall Button6Click(TObject *Sender);__fastcall Button7Click(TObject *Sender);:// User declarations:// User declarationsstr;D1,D2;

__fastcall TForm1(TComponent* Owner);};

//---------------------------------------------------------------------------PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif


Файл реализации модуля обработки Obrabotka.cpp


#include <vcl.h>

#pragma hdrstop

#include "Obrabotka.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma link "FIBDatabase"

#pragma link "FIBDataSet"

#pragma link "pFIBDatabase"

#pragma link "pFIBDataSet"

#pragma link "CGAUGES"

#pragma link "FIBQuery"

#pragma link "pFIBQuery"

#pragma resource "*.dfm"*Form1;*Obr;*Dlt;_S2 *Obr2;_S3 *Obr3;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{Obr = NULL;= NULL;= NULL;}

//---------------------------------------------------------------------------__fastcall TForm1::RadioButton1Click(TObject *Sender)

{ ComboBox1->Enabled = RadioButton1->Checked;->Enabled = RadioButton1->Checked;->Enabled = RadioButton1->Checked;->Enabled = RadioButton2->Checked;->Enabled = RadioButton2->Checked;}

//---------------------------------------------------------------------------__fastcall TForm1::RadioButton2Click(TObject *Sender)

{ComboBox1->Enabled = RadioButton1->Checked;->Enabled = RadioButton1->Checked;->Enabled = RadioButton1->Checked;->Enabled = RadioButton2->Checked;->Enabled = RadioButton2->Checked;->OnChange(NULL);}

//---------------------------------------------------------------------------__fastcall TForm1::RadioButton3Click(TObject *Sender)

{ ComboBox1->Enabled = false;->Enabled = false;->Enabled = false;->Enabled = false;->Enabled = false;="SELECT SUM(A.SALESCOUNT),A.ARTICLE1,A.ARTICLE2,A.LOCID, AVG(B.AR1COST),AVG(B.AR2COST) "

"FROM ASSOTIATIONS_2D A, AS_2D_INFO B "

"WHERE A.ID=B.ID "

"GROUP BY A.ARTICLE1,A.ARTICLE2,A.LOCID "

"ORDER BY A.ARTICLE1,A.ARTICLE2,A.LOCID";}

//---------------------------------------------------------------------------__fastcall TForm1::ComboBox1Change(TObject *Sender)

{ switch(ComboBox1->ItemIndex)

{case 0: { D1 = EncodeDate(StrToInt(Edit1->Text),3,1);= EncodeDate(StrToInt(Edit1->Text),5,31);;}1: {D1 = EncodeDate(StrToInt(Edit1->Text),6,1);= EncodeDate(StrToInt(Edit1->Text),8,31);; }2: {D1 = EncodeDate(StrToInt(Edit1->Text),9,01);= EncodeDate(StrToInt(Edit1->Text),11,30);; }3: {D1 = EncodeDate(StrToInt(Edit1->Text)-1,12,01);= EncodeDate(StrToInt(Edit1->Text),2,29);

//break; }}="SELECT SUM(A.SALESCOUNT),A.ARTICLE1,A.ARTICLE2,A.LOCID,AVG(B.AR1COST),AVG(B.AR2COST) "

"FROM ASSOTIATIONS_2D A, AS_2D_INFO B "

"WHERE A.SALESDATE>='"+D1.DateString()+"' "

"AND A.SALESDATE<='"+D2.DateString()+"' "

"AND A.ID=B.ID "

"GROUP BY A.ARTICLE1,A.ARTICLE2,A.LOCID "

"ORDER BY A.ARTICLE1,A.ARTICLE2,A.LOCID"; }

//---------------------------------------------------------------------------__fastcall TForm1::DateTimePicker1Change(TObject *Sender)

{D1 = DateTimePicker1->Date;= DateTimePicker2->Date;="SELECT SUM(A.SALESCOUNT),A.ARTICLE1,A.ARTICLE2,A.LOCID,AVG(B.AR1COST),AVG(B.AR2COST) "

"FROM ASSOTIATIONS_2D A, AS_2D_INFO B "

"WHERE A.SALESDATE>='"+DateTimePicker1->Date.DateString()+"' "

"AND A.SALESDATE<='"+DateTimePicker2->Date.DateString()+"' "

"AND A.ID=B.ID "

"GROUP BY A.ARTICLE1,A.ARTICLE2,A.LOCID "

"ORDER BY A.ARTICLE1,A.ARTICLE2,A.LOCID";}

//---------------------------------------------------------------------------__fastcall TForm1::Button2Click(TObject *Sender)

{ Button3->Visible = false; (Button2->Caption == "Отмена")

{ switch(RadioGroup1->ItemIndex)

{case 0: {if(Obr!=NULL)Obr->Terminate();break;}1: {if(Obr2!=NULL)Obr2->Terminate();break;}2: {if(Obr3!=NULL)Obr3->Terminate();break;} }->Caption = "Завершение...";->Enabled = false; }{Panel1->Visible = true;->Visible = false; }}

//---------------------------------------------------------------------------__fastcall TForm1::Button1Click(TObject *Sender)

{Button3->Visible = true;->Caption = "Отмена";->Visible = true;->Visible = false;->Caption = IntToStr(RadioGroup1->ItemIndex+1);(RadioGroup1->ItemIndex)

{case 0: { Obr = new WORK(true);>FreeOnTerminate = true;>Resume();; }1: {Obr2 = new WORK_S2(true);->FreeOnTerminate = true;->Resume();; }2: {Obr3 = new WORK_S3(true);->FreeOnTerminate = true;->Resume();; }}}

//---------------------------------------------------------------------------__fastcall TForm1::Button3Click(TObject *Sender)

{switch(RadioGroup1->ItemIndex)

{case 0: {if(Obr!=NULL)

{if(!Obr->Suspended)

{Button3->Caption = "Старт";>Suspend();}{Button3->Caption = "Пауза";>Resume();}}}1: {if(Obr2!=NULL)

{if(!Obr2->Suspended)

{Button3->Caption = "Старт";->Suspend();}{Button3->Caption = "Пауза";->Resume();}}}2: { if(Obr3!=NULL)

{if(!Obr3->Suspended)

{Button3->Caption = "Старт";->Suspend();}{Button3->Caption = "Пауза";->Resume();}}}}}

//---------------------------------------------------------------------------__fastcall TForm1::Button4Click(TObject *Sender)

{if(Application->MessageBox("Все записи из таблицы будут удалены!\nВы уверены?","Подтверждение.",MB_OKCANCEL) == 1)

{Button5->Visible = true;->Visible = true;->Visible = true;->Visible = false;->Caption = "Удаление";= new DLT(true);>FreeOnTerminate = true;>Resume();}}

//---------------------------------------------------------------------------__fastcall TForm1::Button5Click(TObject *Sender)

{if(Dlt!=NULL)Dlt->Terminate();->Visible = true;->Visible = false;}

//---------------------------------------------------------------------------__fastcall TForm1::Button6Click(TObject *Sender)

{ if(Dlt!=NULL)

{ if(!Dlt->Suspended)

{Button6->Caption = "Старт";>Suspend();}{ Button6->Caption = "Пауза";>Resume();}}}

//---------------------------------------------------------------------------__fastcall TForm1::Button7Click(TObject *Sender)

{Application->Terminate();}

//---------------------------------------------------------------------------


Заголовочный файл потока очистки базы DLT.h:


#ifndef DLTH

#define DLTH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include "Obrabotka.h"

//---------------------------------------------------------------------------DLT: public TThread

{private:__fastcall Sync();count1,snc;:__fastcall Execute();:

__fastcall DLT(bool CreateSuspended);};

//---------------------------------------------------------------------------

#endif


Файл реализации потока очистки базы DLT.cpp:


#include <vcl.h>

#pragma hdrstop

#include "DLT.h"

#pragma package(smart_init)

//---------------------------------------------------------------------------

__fastcall DLT::DLT(bool CreateSuspended)

: TThread(CreateSuspended)

{}

//---------------------------------------------------------------------------__fastcall DLT::Sync()

{ switch(snc)

{ case 0:{Form1->Label12->Caption = IntToStr(count1);->CGauge1->MaxValue = count1;;}1:{Form1->CGauge1->Progress++;->Label11->Caption = IntToStr(Form1->CGauge1->Progress);;}2:{Form1->CGauge1->Progress = 0;->Label11->Caption = "";->Label12->Caption = "";->Button5->Visible = false;->Button6->Visible = false;->Panel1->Visible = true;->Panel2->Visible = false;;}}}

//---------------------------------------------------------------------------__fastcall DLT::Execute()

{ Form1->WORK_2->Open();->Del->Active = true;= Form1->Del->RecordCountFromSrv();= 0;(Sync);->Del->First();->pFIBTransaction2->StartTransaction();(!Form1->Del->Eof&&!Terminated)

{Form1->Del->Delete();= 1;(Sync); }(Terminated)

{Form1->pFIBTransaction2->Rollback();= 2;(Sync);->Del->Active = false;->WORK_2->Close();; }(Application->MessageBox("Принять изменеия?","Записи удалены!",MB_YESNO) == 6)

{ Form1->WORK_2->Execute("SET GENERATOR PROB_G TO 0;");->pFIBTransaction2->Commit();}Form1->pFIBTransaction2->Rollback();= 2;(Sync);->Del->Active = false;->WORK_2->Close();}

//---------------------------------------------------------------------------


Заголовочный файл потока обработки №1 WORK.h


#ifndef WORKH

#define WORKH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include "Obrabotka.h"

#include <math.h>

//---------------------------------------------------------------------------WORK: public TThread

{private:__fastcall Sync();snc,count2,count1,ST,k,i;locid,SC,DCn,Sum;ar1[8], ar2[8];M,D,SKO,MSKO,dsum;Start,Stop;:__fastcall Execute();:

__fastcall WORK(bool CreateSuspended);};

//---------------------------------------------------------------------------

#endif


Файл реализации потока обработки №1 WORK.cpp:

#include <vcl.h>

#pragma hdrstop

#include "WORK.h"

#pragma package(smart_init)

__fastcall WORK::WORK(bool CreateSuspended)

: TThread(CreateSuspended)

{}

//---------------------------------------------------------------------------__fastcall WORK::Sync()

{switch(snc)

{case 0:{Form1->Label5->Caption = "Подготовка данных";break;}1:{Form1->Label5->Caption = "Определение диапазона дат";break;}2:{Form1->Label5->Caption = "Определение количества записей бля обработки";break;}3:{Form1->Label12->Caption = IntToStr(count2);->CGauge1->MaxValue = count2;;}4:{Form1->Label7->Caption = Form1->D1.DateString();->Label9->Caption = Form1->D2.DateString();;}5:{Form1->Label5->Caption = "Выборка данных";break;}6:{Form1->Label5->Caption = "Обработка данных";break;}7:{Form1->CGauge1->Progress = count1;->Label11->Caption = IntToStr(count1);(count1%10==0)->Label16->Caption = FloatToStr((double)ST/count1)+" мc";;}8:{Form1->Label5->Caption = "Обработка завершена.";->Label7->Caption = "";->Label9->Caption = "";->Label12->Caption = "";->Label14->Caption = "";->Label16->Caption = "";->CGauge1->Progress = 0;->Label11->Caption = "";->Button2->Caption = "Назад";->Button3->Visible = false;->Enabled = true;;}}}

//---------------------------------------------------------------------------__fastcall WORK::Execute()

{//---- Place thread code here ----

/*DCn - кол-во дней в заданном периоде- кол-во продаж пары товаров- среднее значение- дисперсия- СКО- отношение среднего к СКО- кол-во обработанных записей- общее кол-во записей- артикул1- артикул2- начальная дата- конечная дата*/= 0;(Sync);->Sel_1->Active = false;->Sel_1->SQLs->SelectSQL->Text = Form1->str;->SMSA->Open();->Sel_1->Active = true;->WORK_2->Open();(Form1->RadioButton3->Checked)

{snc = 1;(Sync);->D1 = VarToDateTime(Form1->SMSA->QueryValue("SELECT MIN(SALESDATE) FROM ASSOTIATIONS_2D",0));->D2 = VarToDateTime(Form1->SMSA->QueryValue("SELECT MAX(SALESDATE) FROM ASSOTIATIONS_2D",0));}= 4;(Sync);

//Опеределение количества дней в заданном периоде= DaysBetween(Form1->D1,Form1->D2);++;= 2;(Sync);= 0;= 0;(!Form1->Sel_1->Eof){count2++;Form1->Sel_1->Next();}= 3;(Sync);->Sel_1->First();= 0;(!Form1->Sel_1->Eof&&!Terminated)

{ Start = Time();->pFIBTransaction2->StartTransaction();= Form1->Sel_1->RecordFieldValue(Form1->Sel_1->FieldByFieldNo(1),count1+1);->Sel_1->GetFieldData(2,ar1);->Sel_1->GetFieldData(3,ar2);->Sel_1->GetFieldData(4,&locid);

//Вычисление среднего значения= Sum/(Double)DCn;= 5;(Sync);->Sel_2->Active = false;

//Выборка данных для подсчета дисперсии->Sel_2->SQLs->SelectSQL->Text = "SELECT SALESCOUNT "

"FROM ASSOTIATIONS_2D "

"WHERE ARTICLE1 = '"+(AnsiString)ar1+"' AND "

"ARTICLE2 = '"+(AnsiString)ar2+"' AND "

"LOCID = "+IntToStr(locid)+" AND "

"SALESDATE>='"+Form1->D1.DateString()+"' "

"AND SALESDATE<='"+Form1->D2.DateString()+"'";->Sel_2->Active = true;= 6;(Sync);->Sel_2->First();= DCn;= 0;

//Сумма квадратов отклоненний в дни, когда регистрировалась ассоциация(!Form1->Sel_2->Eof)

{Form1->Sel_2->GetFieldData(1,&SC);+= (SC-M)*(SC-M);-;->Sel_2->Next();}+= k*M*M;//Сумма квадратов отклоненний в остальные дни периода= dsum/DCn;= sqrt(D);= M/SKO;->pFIBQuery1->ParamByName("ARTICLE1")->AsString = ar1;->pFIBQuery1->ParamByName("ARTICLE2")->AsString = ar2;->pFIBQuery1->ParamByName("LOCID")->AsInteger = locid;->pFIBQuery1->ParamByName("FIRSTDATE")->AsDateTime = Form1->D1;->pFIBQuery1->ParamByName("LASTDATE")->AsDateTime = Form1->D2;->pFIBQuery1->ParamByName("M")->AsFloat = M;->pFIBQuery1->ParamByName("D")->AsFloat = D;->pFIBQuery1->ParamByName("SKO")->AsFloat = SKO;->pFIBQuery1->ParamByName("MSKO")->AsFloat = MSKO;->pFIBQuery1->ExecQuery();->pFIBTransaction2->CommitRetaining();->Sel_1->Next();++;= Time();+= MilliSecondsBetween(Start,Stop);= 7;(Sync);}->Sel_1->Active = false;->Sel_2->Active = false;->SMSA->Close();->WORK_2->Close();= 8;(Sync);}

//---------------------------------------------------------------------------


Заголовочный файл потока обработки №2 WORK_S2.h


#ifndef WORK_S2H

#define WORK_S2H

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include "Obrabotka.h"data

{char ar1[8];ar2[8];locid;sum_sc;};

//---------------------------------------------------------------------------WORK_S2: public TThread

{private:__fastcall Sync();snc,count2,count1,ST,k,i;SC,DCn;M,D,SKO,MSKO,dsum;*mas,*buf;Start,Stop;:__fastcall Execute();:

__fastcall WORK_S2(bool CreateSuspended);};

//---------------------------------------------------------------------------

#endif


Файл реализации потока обработки №2 WORK_S2.cpp


#include <vcl.h>

#pragma hdrstop

#include "WORK_S2.h"

#pragma package(smart_init)

//---------------------------------------------------------------------------

__fastcall WORK_S2::WORK_S2(bool CreateSuspended)

: TThread(CreateSuspended)

{}

//---------------------------------------------------------------------------__fastcall WORK_S2::Sync()

{switch(snc)

{case 0:{Form1->Label5->Caption = "Подготовка данных";break;}1:{Form1->Label5->Caption = "Определение диапазона дат";break;}2:{Form1->Label5->Caption = "Запись данных в массив";break;}3:{Form1->Label12->Caption = IntToStr(count2);->CGauge1->MaxValue = count2;;}4:{Form1->Label7->Caption = Form1->D1.DateString();->Label9->Caption = Form1->D2.DateString();;}5:{Form1->Label5->Caption = "Выборка данных";break;}6:{Form1->Label5->Caption = "Обработка данных";break;}7:{Form1->CGauge1->Progress = count1;->Label11->Caption = IntToStr(count1);(count1%10==0)->Label16->Caption = FloatToStr((double)ST/count1)+" мc";;}8:{Form1->Label5->Caption = "Обработка завершена.";->Label7->Caption = "";->Label9->Caption = "";->Label12->Caption = "";->Label14->Caption = "";->Label16->Caption = "";->CGauge1->Progress = 0;->Label11->Caption = "";->Button2->Caption = "Назад";->Button3->Visible = false;->Enabled = true;;}}}

//---------------------------------------------------------------------------__fastcall WORK_S2::Execute()

{snc = 0;(Sync);->Sel_1->Active = false;->Sel_1->SQLs->SelectSQL->Text = Form1->str;->SMSA->Open();->Sel_1->Active = true;->WORK_2->Open();(Form1->RadioButton3->Checked)

{snc = 1;(Sync);->D1 = VarToDateTime(Form1->SMSA->QueryValue("SELECT MIN(SALESDATE) FROM ASSOTIATIONS_2D",0));->D2 = VarToDateTime(Form1->SMSA->QueryValue("SELECT MAX(SALESDATE) FROM ASSOTIATIONS_2D",0));}= 4;(Sync);

//Опеределение количества дней в заданном периоде= DaysBetween(Form1->D1,Form1->D2);++;= 2;(Sync);= 0;= 0;= NULL;

//Копирование данных в массив(!Form1->Sel_1->Eof)

{buf = new data[count2+1];(i = 0;i<count2;i++) buf[i] = mas[i];(mas!=NULL)delete[] mas;= buf;[count2].sum_sc = Form1->Sel_1->RecordFieldValue(Form1->Sel_1->FieldByFieldNo(1),count2+1);->Sel_1->GetFieldData(2,mas[count2].ar1);->Sel_1->GetFieldData(3,mas[count2].ar2);->Sel_1->GetFieldData(4,&mas[count2].locid);++;->Sel_1->Next();}= 3;(Sync);= 0;(i = 0;i<count2&&!Terminated;i++)

{ Start = Time();->pFIBTransaction2->StartTransaction();

//Вычисление среднего значения= mas[i].sum_sc/(Double)DCn;= 5;(Sync);->Sel_1->Active = false;

//Выборка данных для подсчета дисперсии->Sel_1->SQLs->SelectSQL->Text = "SELECT SALESCOUNT "

"FROM ASSOTIATIONS_2D "

"WHERE ARTICLE1 = '"+(AnsiString)mas[i].ar1+"' AND "

"ARTICLE2 = '"+(AnsiString)mas[i].ar2+"' AND "

"LOCID = "+IntToStr(mas[i].locid)+" AND "

"SALESDATE>='"+Form1->D1.DateString()+"' "

"AND SALESDATE<='"+Form1->D2.DateString()+"'";->Sel_1->Active = true;= 6;(Sync);->Sel_1->First();= DCn;= 0;

//Сумма квадратов отклоненний в дни, когда регистрировалась ассоциация(!Form1->Sel_1->Eof)

{Form1->Sel_1->GetFieldData(1,&SC);+= (SC-M)*(SC-M);-;->Sel_1->Next();}+= k*M*M;//Сумма квадратов отклоненний в остальные дни периода= dsum/DCn;= sqrt(D);= M/SKO;->pFIBQuery1->ParamByName("ARTICLE1")->AsString = mas[i].ar1;->pFIBQuery1->ParamByName("ARTICLE2")->AsString = mas[i].ar2;->pFIBQuery1->ParamByName("LOCID")->AsInteger = mas[i].locid;->pFIBQuery1->ParamByName("FIRSTDATE")->AsDateTime = Form1->D1;->pFIBQuery1->ParamByName("LASTDATE")->AsDateTime = Form1->D2;->pFIBQuery1->ParamByName("M")->AsFloat = M;->pFIBQuery1->ParamByName("D")->AsFloat = D;->pFIBQuery1->ParamByName("SKO")->AsFloat = SKO;->pFIBQuery1->ParamByName("MSKO")->AsFloat = MSKO;->pFIBQuery1->ExecQuery();->pFIBTransaction2->CommitRetaining();++;= Time();+= MilliSecondsBetween(Start,Stop);= 7;(Sync);}(mas!=NULL) delete[] mas;->Sel_1->Active = false;->SMSA->Close();->WORK_2->Close();= 8;(Sync);}

//---------------------------------------------------------------------------


Заголовочный файл потока обработки №3 WORK_S3.h


#ifndef WORK_S3H

#define WORK_S3H

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include "Obrabotka.h"

//---------------------------------------------------------------------------WORK_S3: public TThread

{ private:__fastcall Sync();snc,count2,count1,ST,k,i;locid,locid2,SC,DCn,Sum,ID;ar1[8], ar2[8], ar11[8],ar22[8];M,D,SKO,MSKO,Sa,Sb,S,dsum;Start,Stop;V;:__fastcall Execute();:

__fastcall WORK_S3(bool CreateSuspended);};

//---------------------------------------------------------------------------

#endif


Файл реализации потока обработки №3 WORK_S3.cpp


#include <vcl.h>

#pragma hdrstop

#include "WORK_S3.h"

#pragma package(smart_init)

//---------------------------------------------------------------------------

__fastcall WORK_S3::WORK_S3(bool CreateSuspended)

: TThread(CreateSuspended)

{}

//---------------------------------------------------------------------------__fastcall WORK_S3::Sync()

{switch(snc)

{case 0:{Form1->Label5->Caption = "Подготовка данных";break;}1:{Form1->Label5->Caption = "Определение диапазона дат";break;}2:{Form1->Label5->Caption = "Определение количества записей бля обработки";break;}3:{Form1->Label12->Caption = IntToStr(count2);->CGauge1->MaxValue = count2;;}4:{Form1->Label7->Caption = Form1->D1.DateString();->Label9->Caption = Form1->D2.DateString();;}5:{Application->MessageBox("Ошибка обработки!","Ошибка!!!",MB_OK);break;}6:{Form1->Label5->Caption = "Обработка данных";break;}7:{Form1->CGauge1->Progress = count1;->Label11->Caption = IntToStr(count1);(count1%10==0)->Label16->Caption = FloatToStr((double)ST/count1)+" мc";;}8:{Form1->Label5->Caption = "Обработка завершена.";->Label7->Caption = "";->Label9->Caption = "";->Label12->Caption = "";->Label14->Caption = "";->Label16->Caption = "";->CGauge1->Progress = 0;->Label11->Caption = "";->Button2->Caption = "Назад";->Button3->Visible = false;->Enabled = true;;}}}

//---------------------------------------------------------------------------__fastcall WORK_S3::Execute()

{snc = 0;(Sync);->Sel_1->Active = false;->Sel_1->SQLs->SelectSQL->Text = Form1->str;->SMSA->Open();->Sel_1->Active = true;->WORK_2->Open();(Form1->RadioButton3->Checked)

{snc = 1;(Sync);->D1 = VarToDateTime(Form1->SMSA->QueryValue("SELECT MIN(SALESDATE) FROM ASSOTIATIONS_2D",0));->D2 = VarToDateTime(Form1->SMSA->QueryValue("SELECT MAX(SALESDATE) FROM ASSOTIATIONS_2D",0));}= 4;(Sync);

//Опеределение количества дней в заданном периоде= DaysBetween(Form1->D1,Form1->D2);++;= 2;(Sync);= 0;= Form1->Sel_1->RecordCountFromSrv();= 3;(Sync);->Sel_2->Active = false;->Sel_2->SQLs->SelectSQL->Text="SELECT ARTICLE1,ARTICLE2,LOCID,SALESCOUNT,ID "

"FROM ASSOTIATIONS_2D "

"WHERE SALESDATE>='"+Form1->D1.DateString()+"' "

"AND SALESDATE<='"+Form1->D2.DateString()+"' "

"ORDER BY ARTICLE1,ARTICLE2,LOCID";->Sel_2->Active = true;->Sel_2->First();->Sel_2->GetFieldData(1,&ar11);->Sel_2->GetFieldData(2,&ar22);->Sel_2->GetFieldData(3,&locid2);->Sel_2->GetFieldData(4,&SC);->Sel_2->GetFieldData(5,&ID);->Sel_1->First();= 0;(!Form1->Sel_1->Eof&&!Terminated)

{Start = Time();->pFIBTransaction2->StartTransaction();= Form1->Sel_1->RecordFieldValue(Form1->Sel_1->FieldByFieldNo(1),count1+1);->Sel_1->GetFieldData(2,ar1);->Sel_1->GetFieldData(3,ar2);->Sel_1->GetFieldData(4,&locid);->Sel_1->GetFieldData(5,&Sa);->Sel_1->GetFieldData(6,&Sb);

//Вычисление среднего значения= Sum/(Double)DCn;= 6;(Sync);= DCn;= 0;= 0;

//Сумма квадратов отклоненний в дни, когда регистрировалась ассоциация(!Form1->Sel_2->Eof&&locid == locid2&&!StrComp(ar1,ar11)&&!StrComp(ar2,ar22))

{i+= SC;+= (SC-M)*(SC-M);-;->Sel_2->Next();->Sel_2->GetFieldData(1,&ar11);->Sel_2->GetFieldData(2,&ar22);->Sel_2->GetFieldData(3,&locid2);->Sel_2->GetFieldData(4,&SC);->Sel_2->GetFieldData(5,&ID);}(Sum == i && snc!=5)

{dsum += k*M*M;//Сумма квадратов отклоненний в остальные дни периода= dsum/DCn;= sqrt(D);= M/SKO;= MSKO*(Sa+Sb);->pFIBQuery1->ParamByName("ARTICLE1")->AsString = ar1;->pFIBQuery1->ParamByName("ARTICLE2")->AsString = ar2;->pFIBQuery1->ParamByName("LOCID")->AsInteger = locid;->pFIBQuery1->ParamByName("FIRSTDATE")->AsDateTime = Form1->D1;->pFIBQuery1->ParamByName("LASTDATE")->AsDateTime = Form1->D2;->pFIBQuery1->ParamByName("M")->AsFloat = M;->pFIBQuery1->ParamByName("D")->AsFloat = D;->pFIBQuery1->ParamByName("SKO")->AsFloat = SKO;->pFIBQuery1->ParamByName("MSKO")->AsFloat = MSKO;->pFIBQuery1->ParamByName("S")->AsFloat = S;->pFIBQuery1->ExecQuery();->pFIBTransaction2->CommitRetaining();->Sel_1->Next();++;= Time();+= MilliSecondsBetween(Start,Stop);= 7;(Sync);}{snc = 5; Synchronize(Sync); Terminate();->pFIBTransaction2->Rollback(); }}->Sel_1->Active = false;->Sel_2->Active = false;->SMSA->Close();->WORK_2->Close();= 8;(Sync);}


Приложение Ж


Скрипт для создания таблицы задачи 4

SQL DIALECT 3;

/*Используется готовыя база данных с добавлением новой подчиненной таблицы*/"D:\DOCs\WORK\SMSA\SMSA.GDB""SYSDBA" PASSWORD "masterkey";TABLE AS_2D_INFO

(ID INTEGER NOT NULL, COUNT FLOAT,COUNT FLOAT,COST FLOAT,COST FLOAT,COUNTX FLOAT,COUNTX FLOAT,COSTX FLOAT,COSTX FLOAT,KEY(ID),KEY(ID) REFERENCES ASSOTIATIONS_2D ON DELETE CASCADE ON UPDATE CASCADE);;


Приложение И


Листинг программы задачи 4

Заголовочный файл модуля обработки Obrabotka.h :

#ifndef ObrabotkaH

#define ObrabotkaH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <ComCtrls.hpp>

#include "FIBDatabase.hpp"

#include "FIBDataSet.hpp"

#include "pFIBDatabase.hpp"

#include "pFIBDataSet.hpp"

#include <DateUtils.hpp>

#include "WORK.h"

#include "DLT.h"

#include <DB.hpp>

#include <ExtCtrls.hpp>

#include "CGAUGES.h"

#include <Graphics.hpp>

#include "FIBQuery.hpp"

#include "pFIBQuery.hpp"

#include "Oracle.hpp"

#include "OracleData.hpp"

#include <jpeg.hpp>

//---------------------------------------------------------------------------TForm1: public TForm

{__published:// IDE-managed Components*SMSA;*pFIBTransaction1;*AS_2D;*pFIBTransaction2;*Panel1;*Button1;*Panel2;*Bevel1;*Button2;*CGauge1;*Label3;*Label4;*Label5;*Button3;*Image1;*Label10;*Label11;*Label12;*pFIBQuery1;*Button4;*Button5;*Button6;*Label15;*Label16;*Button7;*DBSPUT;*OracleQuery1;*AS_2D_INFO;*Panel3;*Memo1;*Image2;*GroupBox1;*Label1;*DTP1;*DTP2;*Label2;*OracleDataSet1;*Label6;*Label7;*Label8;*Label9;*Image3;*Label13;__fastcall Button2Click(TObject *Sender);__fastcall Button1Click(TObject *Sender);__fastcall Button3Click(TObject *Sender);__fastcall Button4Click(TObject *Sender);__fastcall Button5Click(TObject *Sender);__fastcall Button6Click(TObject *Sender);__fastcall Button7Click(TObject *Sender);:// User declarations:// User declarations

__fastcall TForm1(TComponent* Owner);};

//---------------------------------------------------------------------------PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif


Файл реализации модуля обработки Obrabotka.cpp :


#include <vcl.h>

#pragma hdrstop

#include "Obrabotka.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma link "FIBDatabase"

#pragma link "FIBDataSet"

#pragma link "pFIBDatabase"

#pragma link "pFIBDataSet"

#pragma link "CGAUGES"

#pragma link "FIBQuery"

#pragma link "pFIBQuery"

#pragma link "Oracle"

#pragma link "OracleData"

#pragma resource "*.dfm"*Form1;*Obr;*Dlt;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{ Obr = NULL;= NULL;}

//---------------------------------------------------------------------------__fastcall TForm1::Button2Click(TObject *Sender)

{Button3->Visible = false;(Button2->Caption == "Отмена")

{if(Obr!=NULL)Obr->Terminate();->Caption = "Завершение...";->Enabled = false; }{Panel1->Visible = true;->Visible = false; }}

//---------------------------------------------------------------------------__fastcall TForm1::Button1Click(TObject *Sender)

{Button3->Visible = true;->Caption = "Отмена";->Visible = true;->Visible = false;= new WORK(true);>FreeOnTerminate = true;>Resume();}

//---------------------------------------------------------------------------__fastcall TForm1::Button3Click(TObject *Sender)

{if(Obr!=NULL)

{if(!Obr->Suspended)

{Button3->Caption = "Старт";>Suspend();}{Button3->Caption = "Пауза";>Resume();}}}

//---------------------------------------------------------------------------__fastcall TForm1::Button4Click(TObject *Sender)

{if(Application->MessageBox("Все записи из таблицы будут удалены!\nВы уверены?","Подтверждение.",MB_OKCANCEL) == 1)

{Button5->Visible = true;->Visible = true;->Visible = true;->Visible = false;->Caption = "Удаление";= new DLT(true);>FreeOnTerminate = true;>Resume(); }}

//---------------------------------------------------------------------------__fastcall TForm1::Button5Click(TObject *Sender)

{ if(Dlt!=NULL)Dlt->Terminate();->Visible = true;->Visible = false;}

//---------------------------------------------------------------------------__fastcall TForm1::Button6Click(TObject *Sender)

{if(Dlt!=NULL)

{if(!Dlt->Suspended)

{Button6->Caption = "Старт";>Suspend();}{Button6->Caption = "Пауза";>Resume();}}}

//---------------------------------------------------------------------------__fastcall TForm1::Button7Click(TObject *Sender)

{Application->Terminate();}

//---------------------------------------------------------------------------


Заголовочный файл потока очистки базы DLT.h


#ifndef DLTH

#define DLTH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include "Obrabotka.h"

//---------------------------------------------------------------------------DLT: public TThread

{private:__fastcall Sync();count1,snc;:__fastcall Execute();:

__fastcall DLT(bool CreateSuspended);};

//---------------------------------------------------------------------------

#endif


Файл реализации потока очистки базы DLT.cpp


#include <vcl.h>

#pragma hdrstop

#include "DLT.h"

#pragma package(smart_init)

__fastcall DLT::DLT(bool CreateSuspended)

: TThread(CreateSuspended)

{}

//---------------------------------------------------------------------------__fastcall DLT::Sync()

{switch(snc)

{case 0:{Form1->Label12->Caption = IntToStr(count1);->CGauge1->MaxValue = count1;;}1:{Form1->CGauge1->Progress++;->Label11->Caption = IntToStr(Form1->CGauge1->Progress);;}2:{Form1->CGauge1->Progress = 0;->Label11->Caption = "";->Label12->Caption = "";->Button5->Visible = false;->Button6->Visible = false;->Panel1->Visible = true;->Panel2->Visible = false;;}}}

//---------------------------------------------------------------------------__fastcall DLT::Execute()

{Form1->SMSA->Open();->AS_2D_INFO->Active = true;= Form1->AS_2D_INFO->RecordCountFromSrv();= 0;(Sync);->AS_2D_INFO->First();->pFIBTransaction2->StartTransaction();(!Form1->AS_2D_INFO->Eof&&!Terminated)

{Form1->AS_2D_INFO->Delete();= 1;(Sync);}(Terminated)

{Form1->pFIBTransaction2->Rollback();= 2;(Sync);->AS_2D_INFO->Active = false;->SMSA->Close();;}(Application->MessageBox("Принять изменеия?","Записи удалены!",MB_YESNO) == 6)

{Form1->pFIBTransaction2->Commit();}Form1->pFIBTransaction2->Rollback();= 2;(Sync);->AS_2D_INFO->Active = false;->SMSA->Close();}

//---------------------------------------------------------------------------


Заголовочный файл потока обработки WORK.h


#ifndef WORKH

#define WORKH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include "Obrabotka.h"CheckData {int ID;SUM,COUNT;};ART{ar[8];locid,chcount;*ch;};

//---------------------------------------------------------------------------WORK: public TThread

{private:__fastcall Sync();__fastcall AddErrLog(int);__fastcall DeleteART();__fastcall CreateART();__fastcall BinSearch(char *,int);snc,count1,count2,ST,asc,nasca,nascb,i,j,k,erc;locid,sc,id,L,idx,inda,indb;CHECKNUM,ZNUM,DESKNUM;TOTALSUM,QUANTITY;ar1[8], ar2[8],AR[8];AR1COUNT,AR2COUNT,AR1COST,AR2COST,AR1COUNTX,AR2COUNTX,AR1COSTX,AR2COSTX;Start,Stop,D,PD;qr,erstr;int bid;artcount;*Mas;*ErrLog;Opts;locvalue;:__fastcall Execute();:

__fastcall WORK(bool CreateSuspended);};

//---------------------------------------------------------------------------

#endif


Файл реализации потока обработки WORK.cpp


#include <vcl.h>

#pragma hdrstop

#include "WORK.h"

#pragma package(smart_init)

__fastcall WORK::WORK(bool CreateSuspended)

: TThread(CreateSuspended)

{}

//---------------------------------------------------------------------------__fastcall WORK::Sync()

{ switch(snc)

{case 0:{Form1->Label5->Caption = "Подготовка данных";->Label7->Caption = Form1->DTP1->Date.DateString()+" - "+Form1->DTP2->Date.DateString();->AS_2D->ParamByName("FIRSTD")->AsString = Form1->DTP1->Date.DateString();->AS_2D->ParamByName("LASTD")->AsString = Form1->DTP2->Date.DateString();;}2:{Form1->Label5->Caption = "Определение количества записей для обработки";break;}3:{Form1->Label12->Caption = IntToStr(count2);->CGauge1->MaxValue = count2;;}5:{Form1->Label5->Caption = "Выборка данных";break;}6:{Form1->Label5->Caption = "Формирование массива данных";break;}7:{Form1->CGauge1->Progress = count1;->Label11->Caption = IntToStr(count1);(count1%10==0)->Label16->Caption = FloatToStr((double)ST/count1)+" мc";;}8:{Form1->Label5->Caption = "Обработка завершена.";->Label12->Caption = "";->Label16->Caption = "";->CGauge1->Progress = 0;->Label11->Caption = "";->Button2->Caption = "Назад";->Button3->Visible = false;->Enabled = true;;}9:{erc++;->Label9->Caption = IntToStr(erc);->Label13->Visible = true;->Image3->Visible = true;;}11:{Form1->Label5->Caption = "Заполнение массива";break;}12:{Form1->Label5->Caption = "Поиск в массиве";break;}13:{Form1->Label5->Caption = "Обработка записи";break;}}}

//---------------------------------------------------------------------------__fastcall WORK::Execute()

{/*AR1COUNT - среднее кол-во товара А при покупке ассоциацииCOUNT - среднее кол-во товара В при покупке ассоциацииCOSR - средняя стоимость товара А при покупке ассоциацииCOST - средняя стоимость товара В при покупке ассоциацииCOUNTX - среднее кол-во товара А при покупке вне ассоциацииCOUNTX - среднее кол-во товара В при покупке вне ассоциацииCOSRX - средняя стоимость товара А при покупке вне ассоциацииCOSTX - средняя стоимость товара В при покупке вне ассоциации*/= new TStringList;>Add("***Error log file***");= NULL;= 0;->SMSA->Open();= 0;(Sync);->DBSPUT->Connected = true;->AS_2D->Active = true;->AS_2D_INFO->Active = true;= 2;(Sync);= 0;= Form1->AS_2D->RecordCountFromSrv();->AS_2D->First();= 3;(Sync);.Clear();<< loCaseInsensitive;= 0;(!Form1->AS_2D->Eof&&!Terminated)

{Form1->AS_2D->GetFieldData(1,&id);->AS_2D->GetFieldData(2,ar1);->AS_2D->GetFieldData(3,ar2);->AS_2D->GetFieldData(5,&sc);->AS_2D->GetFieldData(6,&locid);= VarToDateTime(Form1->AS_2D->RecordFieldValue(Form1->AS_2D->FieldByFieldNo(4),count1+1));= (Variant)id;(!Form1->AS_2D_INFO->Locate("ID",&locvalue,Opts))

{Form1->pFIBTransaction2->StartTransaction();(PD!=D)

{PD = D;();();}= Time();= 12;(Sync);= BinSearch(ar1,locid);= BinSearch(ar2,locid);(inda==-1||indb==-1)

{snc = 9;(Sync);(1);}= 13;(Sync);COUNT = 0;AR2COUNT = 0;AR1COST = 0;AR2COST = 0;COUNTX= 0;AR2COUNTX= 0;AR1COSTX = 0;AR2COSTX = 0;= 0;nasca = 0;nascb = 0;= 0;j = 0;(i < Mas[inda].chcount && j < Mas[indb].chcount)

{if(Mas[inda].ch[i].ID < Mas[indb].ch[j].ID)

{nasca++;COUNTX += Mas[inda].ch[i].COUNT;COSTX += Mas[inda].ch[i].SUM;++;}if(Mas[inda].ch[i].ID > Mas[indb].ch[j].ID)

{nascb++;COUNTX += Mas[indb].ch[j].COUNT;COSTX += Mas[indb].ch[j].SUM;++; }if(Mas[inda].ch[i].ID == Mas[indb].ch[j].ID)

{ asc++;COUNT += Mas[inda].ch[i].COUNT;COUNT += Mas[indb].ch[j].COUNT;COST += Mas[inda].ch[i].SUM;COST += Mas[indb].ch[j].SUM;++;j++; }}(i < Mas[inda].chcount)

{nasca++;COUNTX += Mas[inda].ch[i].COUNT;COSTX += Mas[inda].ch[i].SUM;++; }(j < Mas[indb].chcount)

{nascb++;COUNTX += Mas[indb].ch[j].COUNT;COSTX += Mas[indb].ch[j].SUM;++;}->pFIBQuery1->ParamByName("ID")->AsInteger = id;(asc)

{Form1->pFIBQuery1->ParamByName("AR1COUNT")->AsFloat = AR1COUNT/asc;->pFIBQuery1->ParamByName("AR2COUNT")->AsFloat = AR2COUNT/asc;->pFIBQuery1->ParamByName("AR1COST")->AsFloat = AR1COST/asc;->pFIBQuery1->ParamByName("AR2COST")->AsFloat = AR2COST/asc;}{Form1->pFIBQuery1->ParamByName("AR1COUNT")->AsFloat = 0;->pFIBQuery1->ParamByName("AR2COUNT")->AsFloat = 0;->pFIBQuery1->ParamByName("AR1COST")->AsFloat = 0;->pFIBQuery1->ParamByName("AR2COST")->AsFloat = 0;}(nasca) {Form1->pFIBQuery1->ParamByName("AR1COUNTX")->AsFloat = AR1COUNTX/nasca;->pFIBQuery1->ParamByName("AR1COSTX")->AsFloat = AR1COSTX/nasca;}{Form1->pFIBQuery1->ParamByName("AR1COUNTX")->AsFloat = 0;->pFIBQuery1->ParamByName("AR1COSTX")->AsFloat = 0;}(nascb) {Form1->pFIBQuery1->ParamByName("AR2COUNTX")->AsFloat = AR2COUNTX/nascb;->pFIBQuery1->ParamByName("AR2COSTX")->AsFloat = AR2COSTX/nascb; }{Form1->pFIBQuery1->ParamByName("AR2COUNTX")->AsFloat = 0;->pFIBQuery1->ParamByName("AR2COSTX")->AsFloat = 0; }->pFIBQuery1->ExecQuery();->pFIBTransaction2->CommitRetaining();= Time();+= MilliSecondsBetween(Start,Stop);(sc!= asc)

{ snc = 9;(Sync);(0); }}->AS_2D->Next();++;= 7;(Sync);}();ErrLog;->AS_2D_INFO->Active = false;->AS_2D->Active = false;->SMSA->Close();->DBSPUT->Connected = false;= 8;(Sync);}

//---------------------------------------------------------------------------__fastcall WORK::DeleteART()

{if(Mas!=NULL)

{for(j = 0;j<artcount;j++)delete[] Mas[j].ch;[] Mas;= NULL;}}

//---------------------------------------------------------------------------__fastcall WORK::CreateART()

{snc = 5;(Sync);= 0;->OracleDataSet1->Close();= "SELECT CHI.ARTICLE,CHI.LOCID,COUNT(CHI.ZNUM) AS C "

"FROM SUPERMAG.SMCASHCHECKITEMS CHI,SUPERMAG.SMCASHCHECKS CH "

"WHERE CH.PRINTTIME>='"+PD.DateTimeString()+"' "

"AND CH.PRINTTIME<='"+(PD+1).DateTimeString()+"' "

"AND CHI.CHECKNUM=CH.CHECKNUM "

"AND CHI.ZNUM=CH.ZNUM "

"AND CHI.DESKNUM=CH.DESKNUM "

"GROUP BY CHI.ARTICLE,CHI.LOCID "

"ORDER BY CHI.ARTICLE,CHI.LOCID";->OracleDataSet1->SQL->Text = qr;->OracleDataSet1->Active = true;= Form1->OracleDataSet1->RecordCount;->OracleDataSet1->First();= new ART[artcount];(i = 0;i<artcount;i++)

{Form1->OracleDataSet1->GetFieldData(1,Mas[i].ar);[i].locid = Form1->OracleDataSet1->FieldByName("LOCID")->AsInteger;= Form1->OracleDataSet1->FieldByName("C")->AsInteger;[i].chcount = 0;[i].ch = new CheckData[k];->OracleDataSet1->Next();}->OracleDataSet1->Close();= 5;(Sync);->OracleQuery1->Close();= "SELECT CHI.CHECKNUM,CHI.DESKNUM,CHI.ZNUM,CHI.ARTICLE,"

"CHI.LOCID,CHI.QUANTITY,CHI.TOTALSUM "

"FROM SUPERMAG.SMCASHCHECKITEMS CHI,SUPERMAG.SMCASHCHECKS CH "

"WHERE CH.PRINTTIME>='"+PD.DateTimeString()+"' "

"AND CH.PRINTTIME<='"+(PD+1).DateTimeString()+"' "

"AND CHI.CHECKNUM=CH.CHECKNUM "

"AND CHI.ZNUM=CH.ZNUM "

"AND CHI.DESKNUM=CH.DESKNUM "

"ORDER BY CHI.CHECKNUM,CHI.DESKNUM,CHI.ZNUM";->OracleQuery1->SQL->Text = qr;->OracleQuery1->Execute();= 11;(Sync);(!Form1->OracleQuery1->Eof&&!Terminated)

{StrCopy(AR,Form1->OracleQuery1->FieldAsString(3).c_str());= Form1->OracleQuery1->FieldAsInteger(4);= BinSearch(AR,L);= Form1->OracleQuery1->FieldAsInteger(0);= Form1->OracleQuery1->FieldAsInteger(1);= Form1->OracleQuery1->FieldAsInteger(2);= StrToInt(IntToStr(CHECKNUM)+IntToStr(DESKNUM)+IntToStr(ZNUM));= Form1->OracleQuery1->FieldAsFloat(5);= Form1->OracleQuery1->FieldAsFloat(6);(idx!=-1)

{k = -1;(i = 0;i<Mas[idx].chcount;i++)

{if(Mas[idx].ch[i].ID == bid)

{k = i;break;}}(k == -1)

{Mas[idx].ch[Mas[idx].chcount].ID = bid;[idx].ch[Mas[idx].chcount].COUNT = QUANTITY;[idx].ch[Mas[idx].chcount].SUM = TOTALSUM;[idx].chcount++;}{Mas[idx].ch[k].COUNT += QUANTITY;[idx].ch[k].SUM += TOTALSUM;}}->OracleQuery1->Next();}->OracleQuery1->Close();}

//---------------------------------------------------------------------------__fastcall WORK::BinSearch(char *Key,int Loc)

{int m,l,h;= 0;= artcount;(l<=h)

{m = (l+h)/2;(!StrComp(Key,Mas[m].ar))

{if(Loc!=Mas[m].locid)

{while(Loc!=Mas[m].locid&&!StrComp(Key,Mas[m+1].ar))m++;(Loc!=Mas[m].locid&&!StrComp(Key,Mas[m-1].ar))m--;}m;}if(StrComp(Key,Mas[m].ar)<0) h = m-1;l = m+1; }-1;}

//---------------------------------------------------------------------------__fastcall WORK::AddErrLog(int code)

{switch(code)

{ case 0:{erstr = "["+Now().DateTimeString()+"] Ошибка при обработке "

"записи: (ID="+IntToStr(id)+" AR1="+(AnsiString)ar1+" "

"AR2="+(AnsiString)ar2+" LOCID="+IntToStr(locid)+" SALEDATE"

"="+D.DateString()+" SALESCOUNT="+IntToStr(sc)+"). "

"Несовпадение количества продаж, получено: "+IntToStr(asc)+";";>Add(erstr);>SaveToFile("C:\\errlog.txt");;}1:{AnsiString b;(inda == -1)b += (AnsiString)ar1;(indb == -1)b += " "+(AnsiString)ar2;= "["+Now().DateTimeString()+"] Ошибка при обработке "

"записи: (ID="+IntToStr(id)+" AR1="+(AnsiString)ar1+" "

"AR2="+(AnsiString)ar2+" LOCID="+IntToStr(locid)+" SALEDATE"

"="+D.DateString()+" SALESCOUNT="+IntToStr(sc)+"). "

"Не найден артикул: "+b+";";>Add(erstr);>SaveToFile("C:\\errlog.txt");}}}

//---------------------------------------------------------------------------


Приложение К


Список сокращений


АРМ - автоматизированное рабочее место;

БД - база данных;

ДО - диспетчер обработки;

ИАД- интеллектуальный анализ данных;

ПО - прогрммное обеспесение;

ЦУ - центр управления.



Оглавление Введение . Краткое описание комплекса .1 Описание структуры комплекса .2 Описание основных задач комплекса . Выполненные задания

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ