setcolasjsontstable
Задать колонки, которые содержат встроенную подтаблицу и которые надо складывать при выполнении команды "add_row_sum" или при слиянии таблиц с условием суммирования строк, у которых совпадают значения в ключевых колонках.
Объект ts_table позволяет хранить в ячейках встроенные таблицы различного формата.
В различных строках одной и той же колонки таблицы могут храниться подтаблицы с различными структурами.
Для записи подтаблиц у колонок требуется тип данных string.
Чтобы записать подтаблицу в ячейку сначала ее надо перевести в json строку командой "print_to_str_as_json".
В json конструкцию сохраняется вся структура данных подтаблицы и ее содержимое.
Чтобы получить подтаблицу из ячейки надо считать строку и развернуть в объект ts_table командой "load_from_json".
Важной полезностью является возможность автоматического сложения подтаблиц при использовании функции "add_row_sum".
Если задать команду без списка колонок, то все колонки будут не суммируемые.
Вызов:
отменить все отметки колонок что в них хранятся подтаблицы:
ts_table(iTable,"setcolasjsontstable");
отметить колонки, что в них хранятся подтаблицы
ts_table(iTable,"setcolasjsontstable",
int colnum1/string colname1,
int colnum2/string colname2,
...
int colnumN/string colnameN
);
Здесь:
colnumN - номер колонки, которую следует отметить как содержащую подтаблицу;
colname1 - то же можно задать указание названия колонки.
Пример.
Сформировать две таблицы материалов с площадями для различным количеством слоев, так, чтобы для одинаковых названий материала просуммировались, и к тому же в примечании чтобы собрались суммы площадей с расшифровкой по количеству слоев.
Сложить в этих таблицах вододисперсионную краску, экранирующую краску и грунтовку (для грунтовки - расшифровка по числу слоев не требуется)
...
//--------------------------------------------------------------------->
// создать 2 таблицы материалов
int iTableMat1;
object("create", "ts_table", iTableMat1);
ts_table(iTableMat1, "init");
ts_table(iTableMat1, "add_column", 0, "string", "Наименование материала");
ts_table(iTableMat1, "add_column", 1, "double", "Площадь");
ts_table(iTableMat1, "add_column", 2, "string", "Примечания");
ts_table(iTableMat1, "set_first_key", 0); // задаем колонку-первичный ключ - наименование материала
ts_table(iTableMat1, "setcolasjsontstable", 2); // указываем что в этой колонке у нас подтаблица
ts_table(iTableMat1, "set_columns_to_add_sum", 1, 2); // указываем какие колонки складывать
// create_stru_Table_Mat(iTableMat1);
int iTableMat2;
object("create", "ts_table", iTableMat1);
ts_table(iTableMat2, "import_columns_from_table", iTableMat1);
ts_table(iTableMat2, "set_first_key", 0);
ts_table(iTableMat2, "setcolasjsontstable", 2);
ts_table(iTableMat2, "set_columns_to_add_sum", 1, 2);
// create_stru_Table_Mat(iTableMat2);
string snotetablejson;
double square;
double nlayers;
string matname;
// Вододисп.краска в таблицу 1
// 1
matname = "Вододисперсионная краска"; square = 100, nlayers = 1;
ts_table(iTableMat1, "add_row_sum", "Наименование материала", "Вододисперсионная краска", "Площадь", square);
ts_table(iTableMat1, "get_value_of", "Примечания", snotetablejson);
snotetablejson = snotetable_add(snotetablejson, square, nlayers);
ts_table(iTableMat1, "set_value_of", "Примечания", snotetablejson);
matname = "Грунтовка";
ts_table(iTableMat1, "add_row_sum", "Наименование материала", matname, "Площадь", square);
// 2
matname = "Вододисперсионная краска"; square = 200, nlayers = 2;
ts_table(iTableMat1, "add_row_sum", "Наименование материала", matname, "Площадь", square);
ts_table(iTableMat1, "get_value_of", "Примечания", snotetablejson);
snotetablejson = snotetable_add(snotetablejson, square, nlayers);
ts_table(iTableMat1, "set_value_of", "Примечания", snotetablejson);
matname = "Грунтовка";
ts_table(iTableMat1, "add_row_sum", "Наименование материала", matname, "Площадь", square);
// Экранирующая краска в таблицу 2
// 1
matname = "Экранирующая краска"; square = 100, nlayers = 1;
ts_table(iTableMat2, "add_row_sum", "Наименование материала", "Вододисперсионная краска", "Площадь", square);
ts_table(iTableMat2, "get_value_of", "Примечания", snotetablejson);
snotetablejson = snotetable_add(snotetablejson, square, nlayers);
ts_table(iTableMat2, "set_value_of", "Примечания", snotetablejson);
matname = "Грунтовка";
ts_table(iTableMat2, "add_row_sum", "Наименование материала", matname, "Площадь", square);
// 2 - экранирующая краска а поверх нее еще вододисперсионная
matname = "Вододисперсионная краска"; square = 200, nlayers = 2;
ts_table(iTableMat2, "add_row_sum", "Наименование материала", matname, "Площадь", square);
ts_table(iTableMat2, "get_value_of", "Примечания", snotetablejson);
snotetablejson = snotetable_add(snotetablejson, square, nlayers);
ts_table(iTableMat2, "set_value_of", "Примечания", snotetablejson);
matname = "Экранирующая краска"; square = 200, nlayers = 1;
ts_table(iTableMat2, "add_row_sum", "Наименование материала", "Вододисперсионная краска", "Площадь", square);
ts_table(iTableMat2, "get_value_of", "Примечания", snotetablejson);
snotetablejson = snotetable_add(snotetablejson, square, nlayers);
ts_table(iTableMat2, "set_value_of", "Примечания", snotetablejson);
matname = "Грунтовка";
ts_table(iTableMat1, "add_row_sum", "Наименование материала", matname, "Площадь", square);
// объединить обе таблицы в одну с суммированием одинаковых материалов так, чтобы правильно слились и таблицы примечаний
bool bstoponfirstnoteq = false;
bool bsum = true;
ts_table(iTable_Mat1, "add_rows_from_eq_table_by_filter", iTable_Mat2, bstoponfirstnoteq, bsum);
//<---------------------------------------------------------------------
...
// функция для добавления строк в доптаблицу
string snotetable_add(string snotetablejson, double _square, double _nlayers)
{
int iNoteTable;
object("create", "ts_table", iNoteTable);
if (snotetablejson == "")
{
// для первого раза создаем структуру таблицы
ts_table(iNoteTable, "add_column", 0, "double", "Площадь");
ts_table(iNoteTable, "add_column", 1, "double", "Число слоев");
ts_table(iNoteTable, "set_first_key", 1);
ts_table(iNoteTable, "set_columns_to_add_sum", 0); // площади будут автоматом складываться для строк с одинаковым числом слоев
}
else {
// а если таблица уже есть, то грузим ее из json конструкции в объект ts_table
ts_table(iNoteTable, "load_from_json_str", snotetablejson);
}
ts_table(iNoteTable, "add_row_sum", "Площадь", _square, "Число слоев", _nlayers);
ts_table(iNoteTable, "sort");
ts_table(iNoteTable, "print_to_str_as_json", snotetablejson);
object("delete", iNoteTable);
return snotetablejson;
}