вернуться к основную страницу ValTable
О назначении данной компоненты.
Объект, создаваемый данной компонентой,
по свойствам аналогичен таблице значений. Но в отличие от
стандартной таблицы, он дополнен необходимыми методами для
удобной ее обработки.
Изначально компонента создавалась для формирования отчетов с
произвольной детализацией и с разворотом по горизонтали.
При этом методы стандартной таблицы значений не обеспечивали
должного удобства и возможности обработки необходимых объемов.
Ну а дальнейшее ее приминение стало обычным делом.
Скажем вариант, когда требуется свернуть ТаблицуЗначений
строк эдак на 100'000 (или больше). Стандартная ТЗ на этом
просто повесится, и можно будет сходить покурить, попить кофейку...
Ну а если ее выгрузить в мою копоненту, там свернуть и загрузить
обратно в ТЗ, то вся эта операция займет не более пары секунд
(вместе с выгрузкой и загрузкой). Та же ситуация при сохранении ТЗ в файл.
Пример удобства формирования отчетов с произвольной детализацией
и разворотом по периодам можно увидеть в "Пример_ОстаткиПоМесяцам"
Особое место следует уделить использованию памяти.
Стандартная ТЗ будет на каждое дублирование значения выделять память.
Одно значение в стандартной ТЗ занимает 88 байт и если это строка,
плюс еще память под эту строку. Пусть таблица 100'000х10.
Итого 88 мегабайт. В моей таблице одинаковые значения в разных
ячейках не дублируются, а ссылаются на один и тот же выделенный
объект. Т.е. пусть в таблце ~10'000 различных значений справочников
или строк (даже очень большие таблицы это обычно различные комбинации
этих значений). Одно значение в среднем 100 байт. Тогда получается
эта таблица будет 100 * 10'000 + 100'000 * 10 * 4 (ссылка на объект=4 байта)
Итого всего 5 мегабайт. Одно дробоное число = 8 байт (тип Double).
Скрость поиска.
Методы поиска строки со значением, или выборка по значению
обрабатываются в среднем так. Сначала по индексированному (хешированному)
списку ищется объект, а после в линейном списке ссылок (значения колонки)
ищется ссылка на нужный объект. Ну а для современных компьютеров (P4)
перебрать массив из int на 100'000 элементов это настолько мизерная
затрата по времени... То ли дело для стандартной ТЗ, ведь там сравнивается
не int, а равность одного объекта из 88 байт другому.
В результате в моем объекте, в методах поиска, больше времени
происходит сам вызов метода, чем время поиска нужного значения :)
Иерархия подчиненных таблиц и прочие типы таблицы.
Когда вызывается СоздатьОбъект(''AddIn.ValTable''),
создается главная таблица. В последствии при приминении методов
получения различных выборок или итогов создаются дочерние таблицы,
которые ссылаются на главную. Дочерние таблицы делятся на таблицы
итогов и таблицы подмножеств. Таблица подмножества, имеет общие
данные с родительской таблицей, только видит не все строки из родительской.
В результате, при изменении значения ячейки в подмножестве, меняется
родительская таблица, и наоборот, при изменении родительской,
меняется подмножество, но если только меняется та строка, которая
присутствует в подмножестве. Таблица итогов имеет собственные
данные, но каждая строка такой таблицы помнит, из каких строк
родительской таблицы она была образована. Этот набор строк
можно получить применив метод ПолучитьПодмножество. Расчет
таблицы итогов (метод ПолучитьИтоги) происходит при создании
ее, и в дальнейшем не пересчитывается, даже при изменении
данных в родительской. При удалении строки из родительской
таблицы, в таблицах множествах и итогах эта строка все
равно остается, поскольку в действительности при удалении
устанавливается пометка удаления, а не физическое удаление
из памяти. Но при этом, если будут создаваться новые строки
в родительской таблице, то эти строки могут
записаться поверх помеченных на удаление.
Поиски и выборки по фильтрам.
Если в методе выборки/поиска указано, что может быть перечислено несколько значений поиска (через запятую), тогда возможно указать до трех колонок поиска (строка, разделенная запятыми) и соответственно для них значения поиска (для примера см. метод НайтиЗначение).
ВО ВСЕХ методах где осуществляется поиск или выборка по фильтру возможно указывать в качестве значения фильтра СписокЗначений или ТаблицаЗначений (в этом случае будет использоваться первая колонка этой таблицы). Возможность указания фильтра по таблице сделана по причине невозможности добавить в СписокЗначений пустое значение.
При поисках по спискам, поиск осуществляется для всех значений списка, но при этом принадлежность элементов группам НЕ ПРОВЕРЯЕТСЯ, и группы в списке расматриваются как простые значения.
Использование индекса при поиске (если он определен) осуществляется только для первой колонки фильтра (если их указывается несколько), и только для таблиц, которые не являются образованными подмножествами от другой таблицы (таблица, полученная в результате сворачивания не является подмножеством).
Реестр методов свойств
(многие методы, несмотря на похожесть от ТаблицаЗначений, имеют расширенный или даже отличный синтаксис, детально см. ALS в архиве)
ЗагрузитьВнешнююКомпоненту(''ValTable.dll'');
об1 = СоздатьОбъект(''AddIn.ValTable'');
НомерСтроки
<НазвКолонки>
НоваяКолонка
Типы колонок: Строка,Число,Целое,Объект,Дата
УдалитьКолонку
КоличествоКолонок
НомерКолонки
НазваниеКолонки
ТипКолонки
ПереименоватьКолонку
НоваяСтрока
УдалитьСтроку
УдалитьСтроки
УдалитьПоЗначению
КоличествоСтрок
ВыбратьСтроки/ПолучитьСтроку
Первая/Следующая
Последняя/Предыдущая
УстановитьЗначение (также может действовать как заполнение колонки)
ПолучитьЗначение
Установить
Получить
НайтиЗначение
ПолучитьПоЗначению
УстановитьПоЗначению
КопиКолонку
Индекс
Итог
Сортировать
Очистить
Копия
Выгрузить
Загрузить
Версия
Макс
Мин
Множество
ВыбратьПоЗначению
ПолучитьИтоги
ПолучитьПодмножество
ПолучитьМножествоПоФильтру
КоличествоСтрокВПодмножестве