/
CanSeeThePain
/
MqlBotServer
Обзор
Документация
Войти
/
CanSeeThePain
/
MqlBotServer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
SQL/ToVer6_0.sql
219 строк
11 KB
Sergey Tkachenko
Сборка 55. * Проект перенесён на репозиторий git и gitverse.ru: https://gitverse.ru/CanSeeThePain/MqlBotServer Код взят из репозитория Mercurial, поэтому предыдущих версий в git-репозитории нет.
24 июл 2025, 16:15
24 июл 2025, 16:15
3e68c8f
Код
Авторство
О чём код?
-- Обновление БД MqlToSql до версии 6.0 use MqlBotServer; go -- Создание таблицы для сохранения виртуальных ордеров: create table dbo.VirtualOrders ( -- Magic Number робота, который использует данный ордер: BotMagic int not null, -- Тикет виртуального ордера: OrderTicket int not null, -- Внутренний идентификатор ордера: BotInnerId int not null, -- Идентификатор типа ордера: OrderType int not null, -- Цена открытия ордера: OpenPrice decimal(18, 5) not null, -- СЛ и ТП ордера: SL decimal(18, 5) null, TP decimal(18, 5) null, -- Объём ордера - количество лотов: Volume smallmoney not null, -- Значение шага мартингейла для ордера: MStep int null, -- Дата и время открытия ордера: OpenTime datetime not null, -- Пользовательское значение (идентификатор волны): UserInt int not null, -- Идентификатор бот-сервера, которому принадлежат боты, -- для которых сохранены виртуальные ордеры: BotServerId int not null, -- Первичный ключ таблицы: constraint pk_VirtualOrders primary key (BotMagic asc, OrderTicket asc)); go -- Создание таблицы частей запросов SQL для отчётов: create table dbo.ReportSqlParts ( -- Идентификатор записи: id int not null, -- Идентификатор отчёта, для которого предназначается часть SQL: ReportId int not null, -- Порядковый номер части. Нужен, чтобы части при построении запроса -- объединялись строго в указанном порядке. Номер устанавливается пользователем -- и должен начинаться с 1: SerialNumber int not null, -- Идентификатор типа части SQL-запроса. -- 0 - None - часть запроса без указания типа. Предназначена для разнообразных -- действий типа объявнения переменных, присваивания значения этим переменным, -- организации циклов и т.д. -- 1 - Select - часть запроса с оператором "select". -- 2 - From - часть запроса с оператором "from". -- 3 - Where - часть запроса с оператором "where". -- 4 - GroupBy - часть запроса с оператором "group by". -- 5 - Having - часть запроса с оператором "having". -- 6 - OrderBy - часть запроса с оператором "order by". PartTypeId int not null, -- Текст SQL. Может быть пустым (содержать null), так как для некоторых -- типов частей (например, where) текст может формироваться автоматически -- программой на основе данных других таблиц (для where - таблицы фильтров -- отчётов): SqlText nvarchar(max) null, -- Ограничение по количеству строк - для частей с типом "Select": TopRows int null, -- Первичный ключ таблицы: constraint pk_ReportSqlParts primary key (id asc), -- Внешний ключ для привязки параметров отчётов к отчётам: constraint fk_ReportSqlParts_Reports foreign key (ReportId) references dbo.Reports(id) on delete cascade on update cascade); go -- Индекс в таблице частей запросов SQL для отчётов для ускорения выборки -- частей, относящихся к указанному отчёту. create index i_ReportSqlParts_ReportId on dbo.ReportSqlParts(ReportId asc); go -- Уникальный индекс в таблице частей запросов SQL для отчётов для ускорения -- сортировки частей отчёта по порядку и обеспечения уникальности номера части -- в пределах отчёта. create unique index i_ReportSqlParts_SerialNumber on dbo.ReportSqlParts(ReportId asc, SerialNumber asc); go -- Обновление таблицы фильтров отчётов - добавление поля имени параметра для SQL. -- В отличие от названия параметра -- в поле ParName, это имя параметра будет не отображаться пользователю, -- а использоваться в тексте SQL-запроса. В случае, если оно не будет -- заполнено - имя параметра будет, как и раньше, сгенерировано -- путём добавления к названию поля таблицы (ParField) знака "@": alter table dbo.ReportParams add ParNameSql nvarchar(128) null; -- Добавление в таблицу фильтров отчётов идентификатора части -- SQL-запроса, в которую надо добавить фильтр или параметр. -- Должен быть таким же, как поле SerialNumber нужной части отчёта, -- в которую должны добавляться фильтры. Может содержать null - -- для параметров, которые нужны только для объявления переменной, -- но не влияют на текст запроса. alter table dbo.ReportParams add PartSerialNumber int null; go -- Обновление таблицы фильтров отчётов - добавление поля флага -- отсуствия параметра команды. В случае, если в этом поле установлено -- 1 (флаг поднят) - параметр команды создан не будет, будет добавлен -- только текст фильтра: alter table dbo.ReportParams add NoCommandParam bit null; go -- Добавление в таблицу полей отчётов идентификатора части -- SQL-запроса, в которую надо добавить поле. -- Должен быть таким же, как поле SerialNumber нужной части отчёта, -- в которую надо добавить поле. alter table dbo.ReportFields add PartSerialNumber int null; go -- Добавление в таблицу полей отчётов ширины поля (в пикселях) -- при отображении полученного отчёта пользователю: alter table dbo.ReportFields add FieldWidth int null; go -- Добавление в таблицу полей отчётов флага блокировки -- добавления поля. Если флаг включен - поле добавляться не будет, -- а запись будет нужна только для настройки ширины поля: alter table dbo.ReportFields add DontAddField bit null; go -- В запросах "having" могут использоваться обычные параметры отчёта из таблицы -- ReportParams. Поэтому таблица ReportHaving больше не нужна: drop table dbo.ReportHaving; go -- Заполнение таблицы частей SQL для уже имеющихся отчётов. -- Объявление переменных: declare @PartId int; set @PartId = 1; declare @SerialNumber int; declare @ReportId int; declare @SqlSelect nvarchar(max); declare @SqlFrom nvarchar(max); declare @SqlWhere nvarchar(max); declare @SqlGroup nvarchar(max); declare @SqlHaving nvarchar(max); declare @SqlOrder nvarchar(max); declare @TopRows int; declare cur CURSOR local FORWARD_ONLY FOR select id, SqlSelect, SqlFrom, SqlWhere, SqlGroup, SqlHaving, SqlOrder, TopRows from dbo.Reports order by id asc; open cur; fetch next from cur into @ReportId, @SqlSelect, @SqlFrom, @SqlWhere, @SqlGroup, @SqlHaving, @SqlOrder, @TopRows; WHILE @@FETCH_STATUS=0 begin set @SerialNumber = 1; if (@TopRows <= 0) set @TopRows = null; if (@SqlSelect is not null) begin insert into dbo.ReportSqlParts (id, ReportId, SerialNumber, PartTypeId, SqlText, TopRows) values (@PartId, @ReportId, @SerialNumber, 1, @SqlSelect, @TopRows); set @PartId = @PartId + 1; set @SerialNumber = @SerialNumber + 1; end; set @TopRows = null; if (@SqlFrom is not null) begin insert into dbo.ReportSqlParts (id, ReportId, SerialNumber, PartTypeId, SqlText, TopRows) values (@PartId, @ReportId, @SerialNumber, 2, @SqlFrom, @TopRows); set @PartId = @PartId + 1; set @SerialNumber = @SerialNumber + 1; end; if (@SqlWhere is not null) begin insert into dbo.ReportSqlParts (id, ReportId, SerialNumber, PartTypeId, SqlText, TopRows) values (@PartId, @ReportId, @SerialNumber, 3, @SqlWhere, @TopRows); set @PartId = @PartId + 1; set @SerialNumber = @SerialNumber + 1; end; if (@SqlGroup is not null) begin insert into dbo.ReportSqlParts (id, ReportId, SerialNumber, PartTypeId, SqlText, TopRows) values (@PartId, @ReportId, @SerialNumber, 4, @SqlGroup, @TopRows); set @PartId = @PartId + 1; set @SerialNumber = @SerialNumber + 1; end; if (@SqlHaving is not null) begin insert into dbo.ReportSqlParts (id, ReportId, SerialNumber, PartTypeId, SqlText, TopRows) values (@PartId, @ReportId, @SerialNumber, 5, @SqlHaving, @TopRows); set @PartId = @PartId + 1; set @SerialNumber = @SerialNumber + 1; end; if (@SqlOrder is not null) begin insert into dbo.ReportSqlParts (id, ReportId, SerialNumber, PartTypeId, SqlText, TopRows) values (@PartId, @ReportId, @SerialNumber, 6, @SqlOrder, @TopRows); set @PartId = @PartId + 1; set @SerialNumber = @SerialNumber + 1; end; fetch next from cur into @ReportId, @SqlSelect, @SqlFrom, @SqlWhere, @SqlGroup, @SqlHaving, @SqlOrder, @TopRows; end; close cur; deallocate cur; go -- Убираем лишние поля из таблицы отчётов: alter table dbo.Reports drop column SqlSelect; alter table dbo.Reports drop column SqlFrom; alter table dbo.Reports drop column SqlWhere; alter table dbo.Reports drop column SqlGroup; alter table dbo.Reports drop column SqlHaving; alter table dbo.Reports drop column SqlOrder; alter table dbo.Reports drop column TopRows; go -- Добавляем идентификатор бот-сервера в таблицу сохраняемых роботами значений: delete from dbo.BotSavedValues; alter table dbo.BotSavedValues add BotServerId int not null; go -- Обновление версии БД: update dbo.VersionInfo set VerMajor = 6, VerBuild = 0 where id = 1; go