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

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Оглавление

Введение

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

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

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

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

2.1 Задание № 1

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

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

2.2 Задание № 2

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

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

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

2.3 Задание № 3

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

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

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

2.4 Задание № 4

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

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

Заключение

Приложения

Введение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2.1 Задание № 1

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

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

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

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

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

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

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

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

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

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

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

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

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

2.2 Задание № 2

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

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

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

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

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

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

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

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

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

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

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

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

,

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

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

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

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

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

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

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

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

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

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

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

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

2.3 Задание № 3

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

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

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

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

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

,

где n — количество дней в заданном периоде,

xi — количество продаж ассоциации в i-ый день.

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

.

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

.

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

.

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

,

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

SВ — средняя стоимость товара В.

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

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

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

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

2.4 Задание № 4

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

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

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

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

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

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

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

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

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

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

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

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

Рисунок 2. 10 — Форма обработчика после запуска обработки

Заключение

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

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

Приложение А

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

SET SQL DIALECT 3;

CREATE DATABASE «C: TEST. gdb»

USER «SYSDBA» PASSWORD «masterkey»

PAGE_SIZE 8192;

CREATE TABLE TEST

(ID INTEGER NOT NULL,

ARTICLE1 CHAR (8) NOT NULL,

ARTICLE2 CHAR (8) NOT NULL,

LOCID INTEGER NOT NULL,

FIRSTDATE TIMESTAMP NOT NULL,

LASTDATE TIMESTAMP NOT NULL,

P1 FLOAT,

P2 FLOAT,

P3 FLOAT,

P4 FLOAT,

P5 FLOAT,

P6 FLOAT,

CONSTRAINT PK PRIMARY KEY (ID));

COMMIT;

CREATE GENERATOR TEST_G;

COMMIT;

SET TERM ^;

CREATE TRIGGER TEST_T FOR TEST

ACTIVE BEFORE INSERT POSITION 0

AS BEGIN

IF (NEW. ID IS NULL) THEN

NEW. ID = GEN_ID (TEST_G, 1);

END^

SET TERM; ^

COMMIT;

Приложение Б

Листинг программы задачи 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»

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

class TForm2: public TForm

{__published: // IDE-managed Components

TpFIBDatabase *pFIBDatabase1;

TpFIBTransaction *pFIBTransaction1;

TpFIBDataSet *pFIBDataSet1;

TTabbedNotebook *TabbedNotebook1;

TChart *Chart1;

TBarSeries *Series1;

TpFIBTransaction *pFIBTransaction2;

TpFIBDatabase *pFIBDatabase2;

TGroupBox *GroupBox2;

TLabel *Label3;

TLabel *Label5;

TLabel *Label6;

TButton *Button4;

TButton *Button6;

TEdit *Edit3;

TGroupBox *GroupBox1;

TLabel *Label1;

TLabel *Label2;

TEdit *Edit1;

TUpDown *UpDown1;

TEdit *Edit2;

TUpDown *UpDown2;

TButton *Button1;

TButton *Button2;

TChart *Chart2;

TBarSeries *BarSeries1;

TGroupBox *GroupBox3;

TLabel *Label4;

TEdit *Edit4;

TLabel *Label7;

TEdit *Edit5;

TCGauge *CGauge1;

TButton *Button3;

void __fastcall Button2Click (TObject *Sender);

void __fastcall Button1Click (TObject *Sender);

void __fastcall Button6Click (TObject *Sender);

void __fastcall Button4Click (TObject *Sender);

void __fastcall Edit3Exit (TObject *Sender);

void __fastcall Edit3KeyDown (TObject *Sender, WORD & Key,

TShiftState Shift);

void __fastcall TabbedNotebook1Change (TObject *Sender, int NewTab,

bool & AllowChange);

void __fastcall Button3Click (TObject *Sender);

private: // User declarations

public: // User declarations

TChart *Chart;

__fastcall TForm2(TComponent* Owner); };

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

extern 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»

TForm2 *Form2;

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

__fastcall TForm2: :TForm2(TComponent* Owner)

: TForm (Owner)

{ Chart = Chart1; }

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

void __fastcall TForm2: :Button2Click (TObject *Sender)

{ Form1-> Show ();}

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

void __fastcall TForm2: :Button1Click (TObject *Sender)

{AnsiString Name1, Name2;

char Ar1[8], Ar2[8];

TDateTime D1, D2,MaxD, MinD;

int i=1;

pFIBDataSet1-> Active = false;

pFIBDataSet1-> SQLs->SelectSQL->Clear ();

pFIBDataSet1-> SQLs->SelectSQL->Add («SELECT ARTICLE1, ARTICLE2,FIRSTDATE, LASTDATE, P1 FROM TEST WHERE P1> ="+AnsiString („'“)+Edit1->Text+"'"+» AND P1< ="+"'"+Edit2->Text+"'" + «ORDER BY P1 DESC»);

pFIBDatabase1-> Open ();

pFIBDatabase2-> Open ();

pFIBDataSet1-> Active = true;

pFIBDataSet1-> First ();

Series1-> Clear ();

MinD = VarToDateTime (pFIBDatabase1-> QueryValue («SELECT MIN (FIRSTDATE) FROM TEST», 0));

MaxD = VarToDateTime (pFIBDatabase1-> QueryValue («SELECT MAX (LASTDATE) FROM TEST», 0));

CGauge1-> MaxValue = pFIBDataSet1-> RecordCountFromSrv ();

Chart1-> Title->Text->Clear ();

Chart1-> Title->Text->Add («Пары товаров от „+MinD. DateString ()+“ до „+MaxD. DateString ()+“ (диапазон процентов: от „+Edit1-> Text+“ до „+Edit2-> Text+“)»);

Edit1-> Visible = false;

Edit2-> Visible = false;

UpDown1-> Visible = false;

UpDown2-> Visible = false;

Button1-> Visible = false;

CGauge1-> Visible = true;

while (!pFIBDataSet1-> Eof)

{pFIBDataSet1-> GetFieldData (1,Ar1);

pFIBDataSet1-> GetFieldData (2,Ar2);

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

Name2 = pFIBDatabase2-> QueryValueAsStr («SELECT NAME FROM GOODS WHERE ARTICLE="+AnsiString („'“)+AnsiString (Ar2)+"'», 0);

D1 = VarToDateTime (pFIBDataSet1-> RecordFieldValue (pFIBDataSet1->FieldByFieldNo (3), i));

D2 = VarToDateTime (pFIBDataSet1-> RecordFieldValue (pFIBDataSet1->FieldByFieldNo (4), i));

Series1-> AddBar (pFIBDataSet1->RecordFieldValue (pFIBDataSet1->FieldByFieldNo (5), i), Name1+"(«+AnsiString (Ar1)+») «+Name2+"("+AnsiString (Ar2)+») «+D1. DateString ()+"-«+D2. DateString (), clTeeColor);

pFIBDataSet1-> Next ();

CGauge1-> Progress++;

i++; }

pFIBDataSet1-> Active = false;

pFIBDatabase1-> Close ();

pFIBDatabase2-> Close ();

Button4-> Enabled = true;

Button6-> Enabled = true;

Edit3-> Enabled = true;

Edit3-> Text = «1»;

Label6-> Caption = IntToStr (Chart1-> NumPages ());

Edit1-> Visible = true;

Edit2-> Visible = true;

UpDown1-> Visible = true;

UpDown2-> Visible = true;

Button1-> Visible = true;

CGauge1-> Visible = false;

CGauge1-> Progress = 0; }

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

void __fastcall TForm2: :Button6Click (TObject *Sender)

{ Chart-> NextPage ();

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

Edit3-> Text = IntToStr (StrToInt (Edit3-> Text)+1);}

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

void __fastcall TForm2: :Button4Click (TObject *Sender)

{Chart-> PreviousPage ();

if (StrToInt (Edit3-> Text)>1)

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

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

void __fastcall TForm2: :Edit3Exit (TObject *Sender)

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

Chart-> Page = Chart-> NumPages ();

else if (StrToInt (Edit3-> Text)<1)

Chart-> Page = 1;

else Chart-> Page = StrToInt (Edit3-> Text);}

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

void __fastcall TForm2: :Edit3KeyDown (TObject *Sender, WORD & Key,

TShiftState Shift)

{ if (Key == VK_RETURN)

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

{Chart-> Page = Chart-> NumPages ();

Edit3-> Text = StrToInt (Chart-> NumPages ()); }

else if (StrToInt (Edit3-> Text)<1)

{Chart-> Page = 1;

Edit3-> Text = «1»; }

else Chart-> Page = StrToInt (Edit3-> Text);

Edit3-> SelectAll (); }}

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

void __fastcall TForm2: :TabbedNotebook1Change (TObject *Sender, int NewTab,

bool & AllowChange)

{ if (NewTab)

{Button1-> Visible = false;

Button3-> Visible = true;

Chart = Chart2;

Button2-> Left = 920;

Edit3-> Text = IntToStr (Chart2-> Page);

Label6-> Caption = IntToStr (Chart2-> NumPages ());}

else { Button3-> Visible = false;

Button1-> Visible = true;

Chart = Chart1;

Button2-> Left = 270;

Edit3-> Text = StrToInt (Chart1-> Page);

Label6-> Caption = IntToStr (Chart1-> NumPages ());}}

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

void __fastcall TForm2: :Button3Click (TObject *Sender)

{AnsiString Name;

char Ar[8];

TDateTime D1, D2,MaxD, MinD;

int i=1;

pFIBDatabase2-> Open ();

if (Edit4-> Text≠""||Edit5->Text≠"")

{if (Edit4-> Text≠"")

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

if (Edit5-> Text == NULL)

{Application-> MessageBox («Товар не найден!»,"ОШИБКА!", MB_OK); return; }}

else { Edit4-> Text = pFIBDatabase2-> QueryValueAsStr («SELECT ARTICLE FROM GOODS WHERE NAME='"+Edit5-> Text+"'», 0);

if (Edit4-> Text == NULL)

{Application-> MessageBox («Товар не найден!»,"ОШИБКА!", MB_OK); return; }}}

else {Application-> MessageBox («Введите артикул или наименование товара!»,"ОШИБКА!", MB_OK); return; }

pFIBDataSet1-> Active = false;

pFIBDataSet1-> SQLs->SelectSQL->Clear ();

pFIBDataSet1-> 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");

pFIBDatabase1-> Open ();

pFIBDataSet1-> Active = true;

pFIBDataSet1-> First ();

BarSeries1-> Clear ();

MinD = VarToDateTime (pFIBDatabase1-> QueryValue («SELECT MIN (FIRSTDATE) FROM TEST», 0));

MaxD = VarToDateTime (pFIBDatabase1-> QueryValue («SELECT MAX (LASTDATE) FROM TEST», 0));

CGauge1-> MaxValue = pFIBDataSet1-> RecordCountFromSrv ();

Chart2-> Title->Text->Clear ();

Chart2-> Title->Text->Add («Пары для „+Edit5-> Text+“ от „+MinD. DateString ()+“ до „+MaxD. DateString ()+“ (диапазон процентов: от „+Edit1-> Text+“ до „+Edit2-> Text+“)»);

Edit1-> Visible = false;

Edit2-> Visible = false;

UpDown1-> Visible = false;

UpDown2-> Visible = false;

Button3-> Visible = false;

CGauge1-> Visible = true;

while (!pFIBDataSet1-> Eof)

{ pFIBDataSet1-> GetFieldData (1,Ar);

if (AnsiString (Ar) == Edit4-> Text)

pFIBDataSet1-> GetFieldData (2,Ar);

Name = pFIBDatabase2-> QueryValueAsStr («SELECT NAME FROM GOODS WHERE ARTICLE=» + AnsiString («'»)+AnsiString (Ar)+"'", 0);

D1 = VarToDateTime (pFIBDataSet1-> RecordFieldValue (pFIBDataSet1->FieldByFieldNo (3), i));

D2 = VarToDateTime (pFIBDataSet1-> RecordFieldValue (pFIBDataSet1->FieldByFieldNo (4), i));

BarSeries1-> AddBar (pFIBDataSet1->RecordFieldValue (pFIBDataSet1->FieldByFieldNo (5), i), Name+"(«+AnsiString (Ar)+») «+D1. DateString ()+"-«+D2. DateString (), clTeeColor);

pFIBDataSet1-> Next ();

CGauge1-> Progress++;

i++; }

pFIBDataSet1-> Active = false;

pFIBDatabase1-> Close ();

pFIBDatabase2-> Close ();

Button4-> Enabled = true;

Button6-> Enabled = true;

Edit3-> Enabled = true;

Edit3-> Text = «1»;

Label6-> Caption = IntToStr (Chart2-> NumPages ());

Edit1-> Visible = true;

Edit2-> Visible = true;

UpDown1-> Visible = true;

UpDown2-> Visible = true;

Button3-> Visible = true;

CGauge1-> Visible = false;

CGauge1-> 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>

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

class TForm1: public TForm

{__published: // IDE-managed Components

TpFIBDatabase *pFIBDatabase2;

TpFIBTransaction *pFIBTransaction2;

TpFIBDataSet *pFIBDataSet1;

TpFIBDataSet *pFIBDataSet2;

TButton *Button3;

TLabel *Label1;

TpFIBDataSet *pFIBDataSet3;

TpFIBDatabase *pFIBDatabase1;

TpFIBTransaction *pFIBTransaction1;

TLabel *Label2;

TGroupBox *GroupBox1;

TRadioButton *RadioButton1;

TRadioButton *RadioButton2;

TComboBox *ComboBox1;

TEdit *Edit1;

TDateTimePicker *DateTimePicker1;

TLabel *Label3;

TLabel *Label4;

TDateTimePicker *DateTimePicker2;

TUpDown *UpDown1;

TCGauge *CGauge1;

TLabel *Label5;

TButton *Button1;

TGroupBox *GroupBox2;

void __fastcall Button3Click (TObject *Sender);

void __fastcall RadioButton1Click (TObject *Sender);

void __fastcall RadioButton2Click (TObject *Sender);

void __fastcall ComboBox1Change (TObject *Sender);

void __fastcall DateTimePicker1Change (TObject *Sender);

void __fastcall DateTimePicker2Change (TObject *Sender);

void __fastcall Button1Click (TObject *Sender);

private: // User declarations

public: // User declarations

AnsiString Date1, Date2;

__fastcall TForm1(TComponent* Owner); };

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

extern 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»

TForm1 *Form1;

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

__fastcall TForm1: :TForm1(TComponent* Owner)

: TForm (Owner)

{}

void __fastcall TForm1: :Button3Click (TObject *Sender)

{int locid, y, count1,count2,x;

char ar1[8], ar2[8];

TDateTime D1, D2;

/* y — кол-во дней в которые товары регистрировалисль в одном чеке

x — кол-во дней в которые товары продовались вместе

count1 — кол-во обработанных записей

count2 — общее кол-во записей

ar1 — артикул1

ar2 — артикул2

D1 — начальная дата

D2 — конечная дата */

pFIBDatabase1-> Connected = true;

pFIBDatabase2-> Connected = true;

pFIBDataSet1-> Active = true;

//Выборка нужных записей из таблицы ASSOTIATION_2D

pFIBDataSet2-> SQLs->SelectSQL->Clear ();

pFIBDataSet2-> 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″);

pFIBDataSet2-> Active = true;

count1 = pFIBDataSet1-> RecordCountFromSrv ();

count2 = pFIBDataSet2-> RecordCountFromSrv ();

GroupBox2-> Caption = «Обработка: «;

Label1-> Caption = IntToStr (count1);

Form1-> Refresh ();

Label5-> Caption = Label5-> Caption + IntToStr (count2);

CGauge1-> MaxValue = count2;

CGauge1-> Progress = count1;

Form1-> Refresh ();

//Поиск необработанной записи

if (!pFIBDataSet1-> IsEmpty ())

{ TLocateOptions Opts;

Opts. Clear ();

Opts < < loCaseInsensitive;

Variant locvalues[3];

pFIBDataSet1-> Last ();

pFIBDataSet1-> GetFieldData (2,ar1);

pFIBDataSet1-> GetFieldData (3,ar2);

pFIBDataSet1-> GetFieldData (4,&locid);

locvalues[0] = Variant (ar1);

locvalues[1] = Variant (ar2);

locvalues[2] = Variant (locid);

if (pFIBDataSet2-> Locate («ARTICLE1;ARTICLE2;LOCID», VarArrayOf (locvalues, 2), Opts))

pFIBDataSet2-> Next ();

else {Application-> MessageBox («Запись не найдена!»,"ОШИБКА!", MB_OK); Form1-> Close ();}}

//Обработка

while (!pFIBDataSet2-> Eof)

{pFIBTransaction1-> StartTransaction ();

pFIBDataSet2-> GetFieldData (1,ar1);

pFIBDataSet2-> GetFieldData (2,ar2);

pFIBDataSet2-> GetFieldData (3,&locid);

pFIBDataSet2-> GetFieldData (4,&y);

pFIBDataSet3-> SQLs->SelectSQL->Clear ();

pFIBDataSet3-> 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)+"'"+")");

pFIBDataSet3-> Active = true;

pFIBDataSet3-> GetFieldData (1,&x);

if (x) { D1 = VarToDateTime (pFIBDataSet3-> RecordFieldValue (pFIBDataSet3->FieldByFieldNo (2), 1));

D2 = VarToDateTime (pFIBDataSet3-> RecordFieldValue (pFIBDataSet3->FieldByFieldNo (3), 1)); }

else {//!!!Для ошибочных данных!!!

locid = 777;

D1 = StrToDate («07. 07. 2007»);

D2 = StrToDate («07. 07. 2007»);

x = y; }

pFIBDataSet3-> Active = false;

pFIBDataSet1-> Insert ();

pFIBDataSet1-> FieldByName («ARTICLE1»)->AsString = ar1;

pFIBDataSet1-> FieldByName («ARTICLE2»)->AsString = ar2;

pFIBDataSet1-> FieldByName («LOCID»)->AsInteger = locid;

pFIBDataSet1-> FieldByName («FIRSTDATE»)->AsDateTime = D1;

pFIBDataSet1-> FieldByName («LASTDATE»)->AsDateTime = D2;

pFIBDataSet1-> FieldByName («P1»)->AsFloat = (100/float (x))*y;

pFIBDataSet1-> Post ();

pFIBTransaction1-> CommitRetaining ();

count1++;

CGauge1-> Progress = count1;

Label1-> Caption = IntToStr (count1);

Form1-> Refresh ();

pFIBDataSet2-> Next ();}

pFIBDatabase1-> Connected = false;

pFIBDatabase2-> Connected = false;

pFIBDataSet1-> Active = false;

pFIBDataSet2-> Active = false;

CGauge1-> Progress = 0;

Label1-> Caption = ««;

Label5-> Caption = «Всего записей: «;}

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

void __fastcall TForm1: :RadioButton1Click (TObject *Sender)

{ComboBox1-> Enabled = true;

Edit1-> Enabled = true;

UpDown1-> Enabled = true;

DateTimePicker1-> Enabled = false;

DateTimePicker2-> Enabled = false; }

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

void __fastcall TForm1: :RadioButton2Click (TObject *Sender)

{ComboBox1-> Enabled = false;

Edit1-> Enabled = false;

UpDown1-> Enabled = false;

DateTimePicker1-> Enabled = true;

DateTimePicker2-> Enabled = true; }

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

void __fastcall TForm1: :ComboBox1Change (TObject *Sender)

{switch (ComboBox1-> ItemIndex)

{case 0: {Date1 = «'01. 03.» + Edit1-> Text+"'";

Date2 = «'31. 05.» + Edit1-> Text+"'";

break; }

case 1: {Date1 = «'01. 06.» + Edit1-> Text+"'";

Date2 = «'31. 08.» + Edit1-> Text+"'";

break; }

case 2: {Date1 = «'01. 09.» + Edit1-> Text+"'";

Date2 = «'30. 11.» + Edit1-> Text+"'";

break; }

case 3{Date1 = «'01. 12.» + IntToStr (StrToInt (Edit1-> Text)-1)+"'";

Date2 = «'29. 02.» + Edit1-> Text+"'";

break;} }}

void __fastcall TForm1: :DateTimePicker1Change (TObject *Sender)

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

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

void __fastcall TForm1: :DateTimePicker2Change (TObject *Sender)

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

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

void __fastcall TForm1: :Button1Click (TObject *Sender)

{int count1;

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

{ pFIBDatabase1-> Connected = true;

pFIBDataSet1-> Active = true;

GroupBox2-> Caption = «Удаление: «;

count1 = pFIBDataSet1-> RecordCountFromSrv ();

CGauge1-> MaxValue = count1;

Label5-> Caption = Label5-> Caption + IntToStr (count1);

pFIBDataSet1-> First ();

pFIBTransaction1-> StartTransaction ();

while (!pFIBDataSet1-> Eof)

{pFIBDataSet1-> Delete ();

CGauge1-> Progress++;

Label1-> Caption = IntToStr (CGauge1-> Progress); }

Application-> MessageBox («Все записи удалены. «,"Удаление. «, MB_OK);

pFIBDatabase1-> Execute («SET GENERATOR TEST_G TO 0; «);

pFIBTransaction1-> Commit ();

pFIBDatabase1-> Connected = false;

pFIBDataSet1-> Active = false;

CGauge1-> Progress = 0;

Label1-> Caption = ««;

Label5-> 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»

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

class TForm2: public TForm

{__published: // IDE-managed Components

TpFIBDatabase *pFIBDatabase1;

TpFIBTransaction *pFIBTransaction1;

TpFIBDataSet *pFIBDataSet1;

TTabbedNotebook *TabbedNotebook1;

TChart *Chart1;

TBarSeries *Series1;

TpFIBTransaction *pFIBTransaction2;

TpFIBDatabase *pFIBDatabase2;

TGroupBox *GroupBox2;

TLabel *Label3;

TLabel *Label5;

TLabel *Label6;

TButton *Button4;

TButton *Button6;

TEdit *Edit3;

TGroupBox *GroupBox1;

TLabel *Label1;

TLabel *Label2;

TEdit *Edit1;

TUpDown *UpDown1;

TEdit *Edit2;

TUpDown *UpDown2;

TButton *Button1;

TButton *Button2;

TGroupBox *GroupBox3;

TLabel *Label4;

TEdit *Edit4;

TLabel *Label7;

TEdit *Edit5;

TCGauge *CGauge1;

TButton *Button3;

TBarSeries *Series2;

TLabel *Label8;

TChart *Chart2;

TBarSeries *BarSeries1;

TBarSeries *BarSeries2;

TLabel *Label9;

TGroupBox *GroupBox4;

TLabel *Label10;

TEdit *Edit6;

TButton *Button5;

TLabel *Label11;

TLabel *Label12;

TOracleSession *OracleSession1;

TOracleQuery *OracleQuery1;

TpFIBDatabase *pFIBDatabase3;

void __fastcall Button2Click (TObject *Sender);

void __fastcall Button1Click (TObject *Sender);

void __fastcall Button6Click (TObject *Sender);

void __fastcall Button4Click (TObject *Sender);

void __fastcall Edit3Exit (TObject *Sender);

void __fastcall Edit3KeyDown (TObject *Sender, WORD & Key,

TShiftState Shift);

void __fastcall TabbedNotebook1Change (TObject *Sender, int NewTab,

bool & AllowChange);

void __fastcall Button3Click (TObject *Sender);

void __fastcall Chart1AfterDraw (TObject *Sender);

void __fastcall Edit1KeyDown (TObject *Sender, WORD & Key,

TShiftState Shift);

void __fastcall Edit2KeyDown (TObject *Sender, WORD & Key,

TShiftState Shift);

void __fastcall Chart2AfterDraw (TObject *Sender);

void __fastcall Series1Click (TChartSeries *Sender, int ValueIndex,

TMouseButton Button, TShiftState Shift, int X, int Y);

void __fastcall Series2Click (TChartSeries *Sender, int ValueIndex,

TMouseButton Button, TShiftState Shift, int X, int Y);

void __fastcall Button5Click (TObject *Sender);

void __fastcall Edit4KeyDown (TObject *Sender, WORD & Key,

TShiftState Shift);

private: // User declarations

public: // User declarations

TChart *Chart;

AnsiString articul, data1, data2,location;

__fastcall TForm2(TComponent* Owner); };

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

extern 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»

TForm2 *Form2;

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

__fastcall TForm2: :TForm2(TComponent* Owner)

: TForm (Owner)

{Chart = Chart1; }

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

void __fastcall TForm2: :Button2Click (TObject *Sender)

{ Form1-> ShowModal ();}

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

void __fastcall TForm2: :Button1Click (TObject *Sender)

{ AnsiString Name1, Name2;

char Ar1[8], Ar2[8];

TDateTime D1, D2,MaxD, MinD;

int Loc;

pFIBDataSet1-> Active = false;

pFIBDataSet1-> SQLs->SelectSQL->Clear ();

pFIBDataSet1-> 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»);

pFIBDatabase1-> Open ();

pFIBDatabase2-> Open ();

pFIBDataSet1-> Active = true;

pFIBDataSet1-> First ();

MinD = VarToDateTime (pFIBDatabase1-> QueryValue («SELECT MIN (FIRSTDATE) FROM TEST», 0));

MaxD = VarToDateTime (pFIBDatabase1-> QueryValue («SELECT MAX (LASTDATE) FROM TEST», 0));

Series1-> Clear ();

Series2-> Clear ();

Chart1-> Page = 1;

CGauge1-> MaxValue = pFIBDataSet1-> RecordCountFromSrv ();

Label8-> Caption = «Пары товаров от «+MinD. DateString ()+» до «+MaxD. DateString ()+» «

«(диапазон процентов: от „+Edit1-> Text+“ до „+Edit2-> Text+“)»;

Edit1-> Visible = false;

Edit2-> Visible = false;

UpDown1-> Visible = false;

UpDown2-> Visible = false;

Button1-> Visible = false;

CGauge1-> Visible = true;

while (!pFIBDataSet1-> Eof)

{ pFIBDataSet1-> GetFieldData (1,Ar1);

pFIBDataSet1-> GetFieldData (2,Ar2);

Name1 = pFIBDatabase2-> QueryValueAsStr («SELECT NAME FROM GOODS «

«WHERE ARTICLE='"+AnsiString (Ar1)+"'», 0);

Name2 = pFIBDatabase2-> QueryValueAsStr («SELECT NAME FROM GOODS «

«WHERE ARTICLE='"+AnsiString (Ar2)+"'», 0);

D1 = pFIBDataSet1-> FieldByName («FIRSTDATE»)->AsDateTime;

D2 = pFIBDataSet1-> FieldByName («LASTDATE»)->AsDateTime;

Loc = pFIBDataSet1-> FieldByName («LOCID»)->AsInteger;

Series1-> AddBar (pFIBDataSet1->FieldByName («P2″)->AsFloat, Name1+"("+AnsiString (Ar1)+»);"+D1. DateString ()+"-«+D2. DateString (), clTeeColor);

Series2-> AddBar (pFIBDataSet1->FieldByName («P3″)->AsFloat, Name2+"("+AnsiString (Ar2)+»);"+IntToStr (Loc), clTeeColor);

pFIBDataSet1-> Next ();

CGauge1-> Progress++;}

pFIBDataSet1-> Active = false;

pFIBDatabase1-> Close ();

pFIBDatabase2-> Close ();

Button4-> Enabled = true;

Button6-> Enabled = true;

Edit3-> Enabled = true;

Edit3-> Text = «1»;

Label6-> Caption = IntToStr (Chart1-> NumPages ());

Edit1-> Visible = true;

Edit2-> Visible = true;

UpDown1-> Visible = true;

UpDown2-> Visible = true;

Button1-> Visible = true;

CGauge1-> Visible = false;

CGauge1-> Progress = 0; }

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

void __fastcall TForm2: :Button6Click (TObject *Sender)

{AnsiString STR;

Chart-> NextPage ();

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

Edit3-> Text = IntToStr (StrToInt (Edit3-> Text)+1);}

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

void __fastcall TForm2: :Button4Click (TObject *Sender)

{Chart-> PreviousPage ();

if (StrToInt (Edit3-> Text)>1)

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

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

void __fastcall TForm2: :Edit3Exit (TObject *Sender)

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

Chart-> Page = Chart-> NumPages ();

else if (StrToInt (Edit3-> Text)<1) Chart-> Page = 1;

else Chart-> Page = StrToInt (Edit3-> Text);}

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

void __fastcall TForm2: :Edit3KeyDown (TObject *Sender, WORD & Key,

TShiftState Shift)

{ if (Key == VK_RETURN)

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

{Chart-> Page = Chart-> NumPages ();

Edit3-> Text = StrToInt (Chart-> NumPages ());}

else if (StrToInt (Edit3-> Text)<1)

{Chart-> Page = 1;

Edit3-> Text = «1»; }

else Chart-> Page = StrToInt (Edit3-> Text);

Edit3-> SelectAll ();}}

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

void __fastcall TForm2: :TabbedNotebook1Change (TObject *Sender, int NewTab,

bool & AllowChange)

{if (NewTab)

{Button1-> Visible = false;

Button3-> Visible = true;

Chart = Chart2;

Button2-> Left = 920;

Edit3-> Text = IntToStr (Chart2-> Page);

Label6-> Caption = IntToStr (Chart2-> NumPages ());}

else { Button3-> Visible = false;

Button1-> Visible = true;

Chart = Chart1;

Button2-> Left = 270;

Edit3-> Text = StrToInt (Chart1-> Page);

Label6-> Caption = IntToStr (Chart1-> NumPages ());}}

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

void __fastcall TForm2: :Button3Click (TObject *Sender)

{ AnsiString Name1, Name2;

char Ar1[8], Ar2[8];

TDateTime D1, D2,MaxD, MinD;

int i=1,fieldnum, Loc;

pFIBDatabase2-> Open ();

if (Edit4-> Text≠""||Edit5->Text≠"")

{if (Edit4-> Text≠"")

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

if (Edit5-> Text. IsEmpty ()){Application->MessageBox («Товар не найден!»,"ОШИБКА!", MB_OK); return; }}

else {Edit4-> Text = pFIBDatabase2-> QueryValueAsStr («SELECT ARTICLE FROM GOODS WHERE NAME='"+Edit5-> Text+"'», 0);

if (Edit4-> Text == NULL)

{Application-> MessageBox («Товар не найден!»,"ОШИБКА!", MB_OK); return; }}}

else {Application-> MessageBox («Введите артикул или наименование товара!»,"ОШИБКА!", MB_OK); return; }

pFIBDataSet1-> Active = false;

pFIBDataSet1-> 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»;

pFIBDatabase1-> Open ();

pFIBDataSet1-> Active = true;

pFIBDataSet1-> First ();

BarSeries1-> Clear ();

BarSeries2-> Clear ();

MinD = VarToDateTime (pFIBDatabase1-> QueryValue («SELECT MIN (FIRSTDATE) FROM TEST», 0));

MaxD = VarToDateTime (pFIBDatabase1-> QueryValue («SELECT MAX (LASTDATE) FROM TEST», 0));

CGauge1-> MaxValue = pFIBDataSet1-> RecordCountFromSrv ();

Label9-> Caption = «Пары для „„+Edit5-> Text+““ от „+MinD. DateString ()+“ до „+MaxD. DateString ()+“ (диапазон процентов: от „+Edit1-> Text+“ до „+Edit2-> Text+“)»;

Edit1-> Visible = false;

Edit2-> Visible = false;

UpDown1-> Visible = false;

UpDown2-> Visible = false;

Button3-> Visible = false;

CGauge1-> Visible = true;

while (!pFIBDataSet1-> Eof)

{ pFIBDataSet1-> GetFieldData (1,Ar1);

pFIBDataSet1-> GetFieldData (2,Ar2);

Name1 = pFIBDatabase2-> QueryValueAsStr («SELECT NAME FROM GOODS «

«WHERE ARTICLE='"+AnsiString (Ar1)+"'», 0);

Name2 = pFIBDatabase2-> QueryValueAsStr («SELECT NAME FROM GOODS «

«WHERE ARTICLE='"+AnsiString (Ar2)+"'», 0);

D1 = VarToDateTime (pFIBDataSet1-> RecordFieldValue (pFIBDataSet1->FieldByFieldNo (3), i));

D2 = VarToDateTime (pFIBDataSet1-> RecordFieldValue (pFIBDataSet1->FieldByFieldNo (4), i));

Loc = pFIBDataSet1-> RecordFieldValue (pFIBDataSet1->FieldByFieldNo (7), i);

BarSeries1-> AddBar (pFIBDataSet1->RecordFieldValue (pFIBDataSet1->FieldByFieldNo (5), i), Name1+"(«+AnsiString (Ar1)+»);"+D1. DateString ()+"-«+D2. DateString (), clTeeColor);

BarSeries2-> AddBar (pFIBDataSet1->RecordFieldValue (pFIBDataSet1->FieldByFieldNo (6), i), Name2+"(«+AnsiString (Ar2)+»);"+IntToStr (Loc), clTeeColor);

pFIBDataSet1-> Next ();

CGauge1-> Progress++;

i++; }

pFIBDataSet1-> Active = false;

pFIBDatabase1-> Close ();

pFIBDatabase2-> Close ();

Button4-> Enabled = true;

Button6-> Enabled = true;

Edit3-> Enabled = true;

Edit3-> Text = «1»;

Label6-> Caption = IntToStr (Chart2-> NumPages ());

Edit1-> Visible = true;

Edit2-> Visible = true;

UpDown1-> Visible = true;

UpDown2-> Visible = true;

Button3-> Visible = true;

CGauge1-> Visible = false;

CGauge1-> Progress = 0; }

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

void __fastcall TForm2: :Chart1AfterDraw (TObject *Sender)

{AnsiString label1, label2,str1,str2,date;

int h, w, w1,x, y, i, n, a;

Chart1-> Canvas->Pen->Color = clBlack;

for (i = 0;i < Chart1-> MaxPointsPerPage;i++)

{ n = 4*(Chart1-> Page-1)+i;

if (Series1-> Count ()-n-1<0) return;

label2 = Series2-> XLabel[n];

label1 = Series1-> XLabel[n];

a = label1. AnsiPos («;»);

str1 = label1. SubString (1,a-1)+" «;

date = label1. SubString (a+1,label1. Length ());

a = label2. AnsiPos («;»);

str2 = label2. SubString (1,a-1);

h = Chart1-> Canvas->TextHeight (str2);

w1 = Chart1-> Canvas->TextWidth (str2);

w= Chart1-> Canvas->TextWidth (str1);

x = Series2-> CalcXPos (n)-w-1;

if (x< 0) x = 0;

if ((x+w+w1+6)> Chart1->Width) x = Chart1-> Width-(w+w1+6);

y = i*(h+8);

Chart1-> Canvas->Brush->Color = clYellow;

Chart1-> Canvas->FillRect (Rect (x, y, x+w, y+h));

Chart1-> Canvas->Rectangle (x, y, x+w+2,y+h+2);

Chart1-> Canvas->TextOutA (x+1,y+1,str1);

Chart1-> Canvas->Brush->Color = clLime;

Chart1-> Canvas->FillRect (Rect (x+w+2,y, x+w+w1+3,y+h));

Chart1-> Canvas->Rectangle (x+w+2,y, x+w+w1+4,y+h+2);

Chart1-> Canvas->TextOutA (x+w+3,y+1,str2);

Chart1-> Canvas->Brush->Color = clFuchsia;

Chart1-> Canvas->TextOutA (Series2->CalcXPos (n)-62,351,date);

Chart1-> Canvas->Line (Series2->CalcXPos (n), y+h+1,Series2->CalcXPos (n), 353);}}

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

void __fastcall TForm2: :Edit1KeyDown (TObject *Sender, WORD & Key,

TShiftState Shift)

{if (Key == VK_RETURN)

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

else Button1-> OnClick (NULL); }}

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

void __fastcall TForm2: :Edit2KeyDown (TObject *Sender, WORD & Key,

TShiftState Shift)

{ if (Key == VK_RETURN)

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

else Button1-> OnClick (NULL); }}

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

void __fastcall TForm2: :Chart2AfterDraw (TObject *Sender)

{AnsiString label1, label2,str1,str2,date;

int h, w, w1,x, y, i, n, a;

Chart2-> Canvas->Pen->Color = clBlack;

for (i = 0;i < Chart1-> MaxPointsPerPage;i++)

{ n = 4*(Chart2-> Page-1)+i;

if (BarSeries1-> Count ()-n-1<0) return;

label2 = BarSeries2-> XLabel[n];

label1 = BarSeries1-> XLabel[n];

a = label1. AnsiPos («;»);

str1 = label1. SubString (1,a-1)+" «;

date = label1. SubString (a+1,label1. Length ());

a = label2. AnsiPos («;»);

str2 = label2. SubString (1,a-1);

h = Chart2-> Canvas->TextHeight (str2);

w1 = Chart2-> Canvas->TextWidth (str2);

w= Chart2-> Canvas->TextWidth (str1);

x = BarSeries2-> CalcXPos (n)-w-1;

if (x< 0) x = 0;

if ((x+w+w1+6)> Chart2->Width) x = Chart2-> Width-(w+w1+6);

y = i*(h+8);

Chart2-> Canvas->Brush->Color = clYellow;

Chart2-> Canvas->FillRect (Rect (x, y, x+w, y+h));

Chart2-> Canvas->Rectangle (x, y, x+w+2,y+h+2);

Chart2-> Canvas->TextOutA (x+1,y+1,str1);

Chart2-> Canvas->Brush->Color = clLime;

Chart2-> Canvas->FillRect (Rect (x+w+2,y, x+w+w1+3,y+h));

Chart2-> Canvas->Rectangle (x+w+2,y, x+w+w1+4,y+h+2);

Chart2-> Canvas->TextOutA (x+w+3,y+1,str2);

Chart2-> Canvas->Brush->Color = clFuchsia;

Chart2-> Canvas->TextOutA (BarSeries2->CalcXPos (n)-62,351,date);

Chart2-> Canvas->Line (BarSeries2->CalcXPos (n), y+h+1,BarSeries2->CalcXPos (n), 353); }}

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

void __fastcall TForm2: :Series1Click (TChartSeries *Sender, int ValueIndex,

TMouseButton Button, TShiftState Shift, int X, int Y)

{int len, p;

len = Series1-> XLabel[ValueIndex]. Length ();

Label10-> Caption = Series1-> XLabel[ValueIndex]. SubString (len-28,6);

data1 = Series1-> XLabel[ValueIndex]. SubString (len-20,10);

ПоказатьСвернуть
Заполнить форму текущей работой