Задать колонки, которые содержат встроенную подтаблицу и которые надо складывать при выполнении команды "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;
}