Разработка классов TDataObject

Web/сайты Прочее

Был(а) онлайн: 26.04.20 14:45
Umen 26 лет

1.0 Был(а) онлайн: 26.04.20 14:45

Недавно
Постановка на разработку классов TDataObject.

Специальное предупреждение!
По своему назначению, разработка весьма критичная.
Если вы прежде не делали ничего сходственного, и/или не уверены в своих силах – пожалуйста, не беритесь.
Требуются ссылки на теснее сделанные работы сходственного рода.
Только для динозавров, мастодонтов , (и т.п.… - в всеобщем, монстров), программирования! ?

Бюджет – 15.000 рублей.
Срок реализации – 31 день.

Предназначение класса: операции с данными, ранее выбранными из БД, и сейчас сохраненными в памяти PC. Кое-что как бы TDataSet, но проще и с большей функциональностью.
Наименование класса: TDataObject.
Родитель: TObject .

Требования.
1.) Надежность.
2.) Скорость.
3.) Никаких вопросов, отчего меня не устраивают типовые компоненты VCL, предуготовленные для работы с базами данных. Я не знаю, отчего Борланд до сего времени не сделал ничего сходственного.

Доктрина.
Требуется разработать объекты 2-х типов:
1) Структура - TDataStructure;
2) Таблица – TDataTable(TDataStructure);

Описатели-определители.
Их конструкция будет дана добавочно.
TDataFieldDef – описатель для полей. Подобны TFieldDef, но возведены на несколько других тезисах (ориентация не на типы полей, а на их предназначение). Организуются по иерархическому тезису. Должна быть вероятность поддержки полей-конструкций и полей-таблиц.
TDataObjectDef(TDataFieldDef) - описатель для TDataObject.

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

Записи-ссылки.
Должна быть помощь как обыкновенных записей, так и записей-ссылок. Запись-ссылка – это запись, которая не содержит собственных физических данных, а только ссылку на физические данные иной таблицы. При этом обязаны запоминаться:
• Таблица, являющаяся ссылочной;
• Таблица, которой принадлежат физические данные.

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

С подмогой массивов таких ссылок, должна быть вероятность создания вторичных индексов для таблиц, для поддержки нескольких альтернативных порядков сортировки (вся таблица может иметь несколько таблиц-сателлитов, содержащих только ссылки на ее физические данные, и отсортированных по альтернативным тезисам).
Если таблица не отсортирована требуемым образом, но имеет вторичный индекс по этому порядку сортировки – не выдавать ошибку об отсутствии сортировки, а применять вторичный индекс.

Алгорифм метаморфозы содержимого таблиц.
Отличается от принятого в VCL, и заимствован из языка ABAP платформ фирмы SAP.
Всякая таблица имеет “HeaderLine: TDataStructure”, совпадающую по своей структуре со конструкцией таблицы.
Данные в этой структуре дозволено вольно менять без вызова каждых Edit, отображение изменений в таблицу произойдет только позже вызова Modify.

СПОСОБЫ.
Особенно Критичные.
1) SortBy(Имена полей: string имен полей через точку с запятой; AIndexName: string);
Сортирует таблицы в заданном порядке. Если задается AIndexName, создается таблица-сателлит с этим именем, представляющая собой вторичный индекс. Если не задан – сортируется физически сама таблица.
2) Find(Критерии: TRanges); // находит первую запись, удовлетворяющую заданным критериям, данные помещаются в HeaderLine

Это базовые способы. К ним предъявляются особенно высокие требования.
Полный простор для творчества. Assembler приветствуется.

Пояснения.
===================================
TComparisonType = (ctLessThan, ctLessEqaulThan, ctEqual, ctBetween, ctGreaterEqual, ctGreaterThan, ctMask);
TIncludeType = (itInclude, itExclude)
TRangesItem = record
FieldName: string;
Low, High: string;
Option: TComparisonType:
Sign : TIncludeType;
end;

TRanges = array of TRangesItem;

ctMask = задание множеств значений по маске («*PSIH*», «$$$», и т.д.).
С подмогой таких массивов, получаем средство для досканального изложения множества значений для всех полей. Идея заимствована из языка ABAP платформ фирмы SAP.

Массивы для различных полей стыкуются друг с ином по правилу AND.
Внутри массива для всякого из полей, стыкуются по правилу
(IncludeRange1 OR IncludeRange2 OR …IncludeRangeN) AND NOT (ExcludeRange1 OR ExcludeRange2 OR … ExcludeRangeN)

Остальные способы.
3) Constructor TDataObject.Create(TDataObjectDef);
Конструктор, создает TDataObject заданной конструкции;

4) Constructor TDataTable.CreateAsCopyFrom(AAsRefs: boolean; ASource: TDataTable; ARanges: TRanges; ASortFields: string);
Создает таблицу, как копию иной таблицы, содержащую заданное подмножество ее записей и отсортированных по заданным полям.
Если “AAsRefs = true”, создает таблицу с записями-ссылками. Напротив копирует физические данные

5) Constructor TDataObject.CreateFromPack(ASource: string);
Создает TDataObject из пакета. При этом пакет должен содержать не только данные, но и изложение конструкции. См. способы PackToString, UnpackFromString.

6) BeginLoop(Критерии: TRanges; LoopName: string);
7) NextLoop(LoopName: string): boolean;
8) EndLoop(LoopName: string);
Для организации циклов по записям, удовлетворяющих заданным условиям. Поиск первой записи, удовлетворящей заданным условиям, должен осуществляться по тезису двоичного дерева, дальше читаются остальные записи. Таблица должна быть соответствующим образом отсортирована, напротив оплошность.
EndLoop сбрасывает режим.
Должна быть вероятность циклов по нескольким тезисам единовременно (для этого и введен параметр LoopName). Скажем, идет внешний цикл по одному тезису. А внутри цикла, идет еще вложенный цикл по этой же таблице, организованный по иному тезису.

9) ReadByIndex(AIndex: integer);
Читает запись по ее индексу, данные помещаются в HeaderLine.

10) Collect(ARanges: TRanges; const AKeyFields, ASumFields, ACountFields): TDataTable;
Все три параметра представляют собой последовательности имен полей, поделенных точкой с запятой. AKeyFields является непременным параметром, но может содержать значение «*» (все поля являются ключевыми).
Создает сводную таблицу (по записям, удовлетворяющим заданным условиям), построенную по дальнейшему тезису:
AKeyFields – список ключевых полей, по которым происходит группировка.
ASumFields – список полей, значения которых суммируются.
ACountFields – список полей, по которым подсчитывается число уникальных значений.
Конструкция результирующей таблицы:
Поля из AKeyFields – без метаморфозы имени, в том же порядке, каком перечислены и с тем же порядком сортировки;
Поля из ASumFields – имена суммируемых полей + приставка _SUM;
Поля из ACountFields – имена полей + приставка _COUNT;
Плюс, поле с фиксированным именем COUNT – содержит число полей, вошедших в всякую группировку.

11) PackToString: string;
Исполняет «развертывание» данных таблица в одну строку. Есть некоторые наработки, уточнения будут даны в больше детальной постановке.

12) UnpackFromString(ASource: string);
Исполняет поправление данных из строки (пакета).

Это основные и особенно трудоемкие особенности.
В детальной постановке будут еще добавочные хотелки.

Чтобы добавить заявку к этому заказу, нужно войти или зарегистрироваться

Мой блок

26.04.20 14:45
Umen 26