Для обработки табличных данных LabPP_Automat предоставляет мощный инструмент ts_table(...).
Чтобы его использовать необходимо сначала создать объект типа "ts_table" при помощи функции создания объекта.
Эта функция возвращает целое число. Это так называемый дескриптор объекта.
Указывая его при обращении к функциям ts_table(...) мы указываем с каким экземпляром объекта мы хотим выполнить действия.
Здесь мы создадим объект типа ts_table:
int TableDescr1; // объявляем переменную типа "целое чиcло".
object("create","ts_table",TableDescr1); // создаем объект типа "ts_table" и его дескриптор записываем в переменную TableDescr1
// Здесь мы работаем с нашим экземпляром объекта ts_table->
// <-
object("delete",TableDescr1); // когда экземпляр объекта больше не нужен - удаляем его по его дескриптору.
Благодаря использованию дескрипторов мы можем одновременно работать с большим количеством табличных объектов. А это, в свою очередь, дает нам возможность создавать отчеты и обработки невероятной сложности просто, удобно и понятно.
Для работы с экземпляром объекта "ts_table" используется функция
ts_table(int descriptor, string directive, ....);
Суть строковой директивы определяет список и значение следующих далее аргументов.
add_column | добавить колонку в таблицу | |
set_first_key | задать колонку, по которой отслеживать уникальность строк (очень удообно) | |
add_row | добавить строку | |
add_row_sum |
добавить строку с суммированием числовых значений других колонок, |
|
sort | выполнить сортировку строк таблицы по заданной колонке | |
select_row | сделать текущей заданную строку таблицы | |
search | быстрый поиск строки по значению в колонке | |
get_value_of | получить значение из заданной колонки текущей строки | |
get_rows_count | получить количество строк в таблице | |
get_columns_count | получить количество колонок в таблице |
add_column
Колонки могут быть строковыми или числовыми.
Формат команды:
ts_table(int descriptor, "add_column", int columnnumber, string columnname);
Здесь:
descriptor - дескриптор экземпляра объекта таблицы, у которой добавляется колонка.
columnnumber - номер колонки (можно поставить -1 чтобы программа сама создала номер).
columnname - название (заголовок) колонки.
Пример чтобы добавить текстовую колонку №0:
ts_table(TableDescr1, "add_column",0,"string","код материала + ед.изм.");
Пример чтобы добавить числовую колонку с вычисляемым номером по значению переменной № = i + 3
ts_table(TableDescr1, "add_column",i+3,"double",szonename);
set_first_key
Когда нужно избежать дублирования записей в таблице можно использовать удобный механизм.
Одну из колонок можно задать в качестве так называемого "первичного ключа".
После этого все добавляемые строки будут анализироваться и если в таблице уже есть строка с таким же значением в колонке, то новая строка создаваться не будет.
А если добавление строки производится не простой директивой "add_row" а "add_row_sum" то в обнаруженной строке будут суммированы значения числовых колонок (см. add_row_sum).
Пример, чтобы сделать колонку №1 ключевой:
ts_table(TableDescr1,"set_first_key",1);
Пример, чтобы сделать колонку с названием "Наименование объекта" ключевой:
ts_table(TableDescr1,"set_first_key","Наименование объекта");
add_row
Добавление строки.
ts_table(TableDescr1,"add_row", 0, objectname, 1, value_to_column_1, 2, value_to_column_2);
Здесь в колонку №0 записываем значение из переменной objectname, в колонку №1 записываем значение value_to_column_1, и в колонку №2 записываем значение переменной value_to_column_2.
Если колонка №0 задана как "первичный ключ" (указана в директиве set_first_key), то можно записывать значения колонок за несколько команд:
ts_table(TableDescr1,"add_row", 0, objectname, 1, value_to_column_1);
ts_table(TableDescr1,"add_row", 0, objectname, 2, value_to_column_2);
Данные допишутся в ту же строку со значением в ключевой колонке №0.
add_row_sum
Добавление строки с суммированием в числовых колонках со строкой, у которой совпадает значение ключевой колонки.
Проще всего объяснить на актуальном красивом примере.
Имеются объекты "Доска". В этих объектах есть поле "типоразмер" ("100х40","50х40" и т.п.), "единица измерения" ("пог.м","кв.м","куб.м") и "количество".
Мы хотим получить суммарную таблицу, где бы все объекты типа "Доска", в проекте просуммировались следующим образом:
Материал | Ед.изм | Кол-во |
Доска 100х50 | пог.м | 1000 |
Доска 50х40 | куб.м. | 2000 |
Доска 50х20 | кв.м. | 1900 |
Для этого создаем таблицу с одной ключевой колонкой и колонками для обычных данных
ts_table(TableDescr1,"add_column",0,"string","имя объекта + типоразмер + ед.изм");
ts_table("TableDescr, "set_first_key",0);
ts_table(TableDescr1,"add_column", 1,"string",objectname);
ts_table(TableDescr1,"add_column", 2,"string",tiporazmer);
ts_table(TableDescr1,"add_column", 3,"string",edizm);
ts_table(TableDescr1,"add_column", 4,"double",kolvo);
Для добавления строки в таблицу просто используем следующую запись:
ts_table(TableDescr1,"add_row_sum",0,objectname+tiporazmer+edizm, 1,objectname, 2, tiporazmer, 3, edizm, 4, kolvo);
В результате в таблице все объекты с одинаковыми значениеми имя+типоразмер+ед.изм. сведутся в единые записи, а в колонке "количество" будет стоять сумма количеств.
sort
Сортировка строк таблицы по заданной колонке или по ключевой колонке (если без аргументов).
Пример. Сортировка таблицы по колонке №0
ts_table(TableDescr1,"sort",0);
Пример. Сотритовка таблицы по ключевой колонке, указанной ранее.
ts_table(TableDescr1,"sort");
После добавления новой строки требуется повторная сотрировка.
search
Быстрый поиск в таблице первого совпадающего значения колонки.
Возвращает номер строки или -1, если такая строка отсутствует в таблице.
Пример. Найти строку со значением в колонке №1 "Доска"
int irow = ts_table(TableDescr1,"search",1,"Доска");
select_row
Сделать текущей указанную строку в таблице.
Пример. Сделать текущей первую строку в таблице (индекс строки - от 0 до n-1):
int i=0;
ts_table(TableDescr1,"select_row",i);
get_value_of
Получить значение из заданной колонки текущей строки таблицы
Пример. Получить значение из колонки №0 текущей строки таблицы в переменную objectname:
string objectname;
ts_table(TableDescr1,"get_value_of",0,objectname);
get_rows_count
Получить количество строк в таблице в заданную переменную
int rowcount;
ts_table(TableDescr1,"get_rows_count", rowcount);
get_columns_count
Получить количество колонок в таблице в заданную переменную
int colcount;
ts_table(TableDescr1,"get_columns_count", colcount);