Пример создания схемы работы с эмитентами и биржами в BSI
Цель создания схемы - отслеживать котировки акций на каждой из бирж любому эмитенту и выводить их на экран через определенный промежуток времени (в заданное время).
На этом примере можно сделать свои схемы, сделать свою конструкцию в соответствии со своей моделью.
Схема описывает таблицу, поля в ней и взаимосвязь с другими схемами.
Используется для описания структуры данных, т.е. объектной модели.
Схема имеет следующие базовые возможности:
1.Загрузка/сохранение в базу данных
2.Отслеживание изменений данных
3.Простейшая проверка на правильность данных (min, max)
ШАГИ В СОЗДАНИИ СХЕМЫ
- Запуск BSS
- Настройка схемы
- Ввод тестовых данных
- Мастер запросов, создание запроса на выборку результатов
- Вывод отчета на экран
1. ЗАПУСК BSS
Запускаем BSS, обращаем внимание на рабочий каталог, в котором хранятся схемы и сама система.
Нажав символ «~», запускаем режим работы с командной строкой.
2. НАСТРОЙКА СХЕМЫ
ВАЖНЫЕ КОМАНДЫ ДЛЯ ЗАПУСКА
В командной строке могут запускаться такие команды
Наименование |
Команда для запуска |
Настройка модуля |
SystemSetup |
Настройка системы |
SetupModule |
Запуск скрипта |
RunScript <Script name> |
Порядковые номера |
RunDict Sequences |
Типы запросов |
RunDict ViewType |
Типы группировок |
RunDict GroupViewType |
Определение конвертации |
RunDict ConvPackage |
Пользователи |
RunDict Users |
Роли |
RunDict Role |
Регистр настройки |
RegEdit |
ВАЖНЫЕ ФАЙЛЫ КАТАЛОГА
Обратим внимание на основные файлы настроек, которые хранятся в корневой директории BSI
- App.ini - основной файл настроек интегратора
- Bsi.exe - исполнительный файл программы
- Errors.log - Log-файл ошибок
- Log.txt - Log-файл
- Sys.ini - файл настроек основного модуля BS Integrator
- System.ini - вспомогательный файл настроек.
ИСХОДНЫЕ ДАННЫЕ
Схема описывает таблицу, поля в ней и взаимосвязь с другими схемами.
Используется для описания структуры данных, т.е. объектной модели.
Построенная структура в базовом варианте будет иметь возможности добавления информации по биржам, эмитентам и котировкам, запрашивать котировки на определенные даты, выводить отчет на экран.
СОЗДАНИЕ СХЕМЫ
В каталоге \Schemas\Exch\ создадим новую схему, назовем ее exchange_schema.xml
В этой схеме мы опишем создание системы таблиц для сохранения данных о биржах, эмитентах и котировках
Таблица 1. Биржи ExchangeMarket
Таблица 2. Эмитенты Emitent
Таблица 3. Котировки Quote
Таблица 4. Соответствия кодов эмитентов кодам на биржах EmitentDetail
ТАБЛИЦЫ В СХЕМЕ
Напишем заголовок схемы:
<?xml version="1.0" encoding="UTF-8"?>
<schema>
Далее создадим первую таблицу
<element name="ExchangeMarket" TableName="fc_exchangemarket" PkName="ExchangeMarket_ID"
Book="ExchangeMarket_ID" ColFormClass="TfrmUniDict" DictFormClass="TfrmUniDict"
CardFormClass="TfrmDetailsCard" ModuleName="SYS" Title="Биржа"Caption="Биржа"
Help="В схеме хранятся данные о биржах">
<element name="ExchangeMarket_ID" type="code" FieldName="ExchangeMarket_ID"
SchemaClass="TIdentitySchema" Title="Код" NotNull="True"
Help="В поле указывается код биржи, присваивается автоматически"/>
<element name="Name" type="name" FieldName="Name" NotNull="True"
Help="Указывается название биржи"/>
<element name="UpdateData" type="UpdateData"/>
</element>
Три вложенных элемента – это описания полей в таблице.
Также обратим внимание на важные параметры и элементы
ModuleName="SYS" – модуль схемы, используем SYS для того чтобы схема могла участвовать в запросах
TableName="fc_exchangemarket"– связь с таблицей в БД
PkName="ExchangeMarket_ID– поле первичного ключа
Title="Биржа" – Заголовок элемента
SchemaClass="TIdentitySchema" – ключевое поле формируется автоматически
NotNull="True" - поле не может быть пустым
<element name="UpdateData" type="UpdateData"/> - автоматически создаются поля CreateID, ChangeID
type="string" size="15" RefBook="Emitent" - тип поля, длина, RefBook – описывает связь с другим элементом схемы
type– может принимать значения типа поля, включая пользовательские. Например type="string" size="250", type="string250"– поля типа String с длинной 250.
Далее добавляем таблицу эмитентов
<element name="Emitent" TableName="fc_emitent" PkName="Emitent_ID" Book="Emitent"
ColFormClass="TfrmUniDict"DictFormClass="TfrmUniDict" CardFormClass="TfrmDetailsCard"
ModuleName="SYS" Title="Эмитент" Caption="Эмитент" Help="Эмитенты">
<element name="Emitent_ID"type="string"size="15"FieldName="Emitent_ID"UnderLabel="True"
Title="Код" NotNull="True" Help="Символ эмитента"/>
<element name="Name" type="name" FieldName="Name" UnderLabel="True" NotNull="True"
Help="Указывается название эмитента"/>
<element name="UpdateData" type="UpdateData"/>
</element>
Таблицу котировок
<element name="Quote" TableName="fc_quote" PkName="Code" ColFormClass="TfrmUniDict"
DictFormClass="TfrmUniDict" CardFormClass="TfrmDetailsCard"
ModuleName="SYS" Title="Котировки"Caption="Котировка" Help="Котировки">
<element name="Code" type="Code" FieldName="ID" SchemaClass="TIdentitySchema" Title="Код"
Visible="False" Help="Код" />
<element name="Emitent_ID" type="string" size="15" RefBook="Emitent"
FieldName="Emitent_ID" Title="Эмитент" NotNull="True" Help="Символ эмитента" />
<element name="ExchangeMarket_ID" type="integer" size="0" RefBook="ExchangeMarket"
FieldName="ExchangeMarket_ID" Title="Биржа" NotNull="True" Help="Биржа" />
<element name="LastPrice" type="money" FieldName="Last_Price" Title="Цена" NotNull="True"
Help="Последняя цена" />
<element name="DateQuote" type="date" FieldName="Date_Quote" Title="Дата Котировки"
NotNull="True" Help="Дата котировки" />
<element name="Volume" type="integer" FieldName="Volume" Title="Количество"
NotNull="True" Help="Количество" />
<element name="UpdateData" type="UpdateData"/>
</element>
Обратим внимание на параметр RefBook="Emitent", в котором указывается референс, соединение с другой таблицей, в нашем случае это таблицы бирж и эмитентов.
Далее таблицу деталей эмитентов, в которой сохраняются соответствия кодов эмитентов кодам на биржах
<element name="EmitentDetail" TableName="fc_emitentdetail"
PkName="DetailID" Book="EmitentDetail" ColFormClass="TfrmUniDict"
DictFormClass="TfrmUniDict" CardFormClass="TfrmDetailsCard"
ModuleName="SYS" Title="Детали эмитента" Caption="Детали эмитента" Help="Детали эмитента" >
<element name="DetailID" type="Code" FieldName="Detail_ID"
SchemaClass="TIdentitySchema" Title="Кодзаписи" Visible="False" Help="Код записи" />
<element name="EmitentID" type="string" size="15" FieldName="Emitent_ID" UnderLabel="True"
RefBook="Emitent" Title="Код эмитента" NotNull="True" Help="Символ эмитента" />
<element name="ExchangeMarket_ID" type="integer" size="0" FieldName="ExchangeMarket_ID"
RefBook="ExchangeMarket" Title="Код" NotNull="True" Help="Код биржи" />
<element name="EmitentExCode" type="string" size="15"
FieldName="Emitent_ExCode" UnderLabel="True"
Title="Обозначение на бирже" NotNull="True" Help="Обозначение на бирже"/>
<element name="UpdateData" type="UpdateData"/>
</element>
Завершаем схему:
</schema>
Реляционная структура созданной схемы:
ИСПОЛЬЗОВАНИЕ СОЗДАННОЙ СХЕМЫ
Добавим ссылку на новую схему в ClientFiles.xml
<schema name="ExchangeMarket">Settings\Exchange_schema.xml</schema>
<schema name="Emitent">Settings\Exchange_schema.xml</schema>
<schema name="Quote">Settings\Exchange_schema.xml</schema>
<schema name="EmitentDetail">Settings\Exchange_schema.xml</schema>
RunScript InstallSchema(ExchangeMarket)
RunScript InstallSchema(Emitent)
RunScript InstallSchema(Quote)
RunScript InstallSchema(EmitentDetail)
3. ВВОД ТЕСТОВЫХ ДАННЫХ
Попробуем ввести данные, используя созданную структуру:
RunDict ExchangeMarket
Вводим две биржи – NYSC и LSE
RunDict Emitent
Ввели два эмитента – ABC Steel и ZYC Houses
RunDict EmitentDetail
Для каждого из эмитентов вводим его код на каждой из бирж
RunDict Quote
Вводим котировки
4. МАСТЕР ЗАПРОСОВ, СОЗДАНИЕ ЗАПРОСА НА ВЫБОРКУ РЕЗУЛЬТАТОВ
Используя информацию из руководства BSIntegrator.doc, создадим запрос, выводящий на экран котировки
Выберем мастер запросов
Создадим новый запрос, при создании указываем схему как основание запроса, его название, выбираем нужные нам поля
Одно из наших полей будет вычисляемым
Вычислим значение кода эмитента, уникальное для каждой биржи, используя таблицу EmitentDetail
(SELECT DISTINCT Emitent_ExCode FROM fc_emitentdetail WHERE
fc_emitentdetail.Emitent_ID = ~Emitent_ID~ AND
fc_emitentdetail.ExchangeMarket_ID = ~ExchangeMarket_ID~)
Создадим условия отбора
При желании укажем параметры сортировки
Запустим наш запрос с необходимыми параметрами
5. ВЫВОД ОТЧЕТА НА ЭКРАН
На скриншоте показа результат работы схемы.
На основе примера мы научились создавать схемы и строить запросы