Как получить типы полей в таблице по ссылке?

Добрый день!

Как получить типы полей в таблице по ссылке из поля Reference?

const current = new SimpleRecord('itsm_incident'); 
current.get('170539993117855116');

current.caller // -- и вот здесь получить список всех полей и их типы.
               // Где caller это Reference на другую таблицу

Есть таблица колонки (sys_db_column). В ней как раз все поля таблиц описаны. Но надо учитывать, что таблица может быть основана на другой таблице и надо также просматривать поля родительской таблицы.

Код ниже как раз и выдаст список полей и их типы референсной таблицы.

const current = new SimpleRecord('itsm_incident'); 
current.get('170539993117855116');

const tableId = getTableIdByName(current.getTableName()); //получаем id текущей таблицы
const refTableId = getTableIdByReference(tableId,'caller'); //получаем id референсной таблицы поля caller

if (refTableId) {
 const result = getComuns(refTableId);
// вывод результата
  result.forEach(function(item){
   print(item.column_name+' - '+getColumnTypeNameById(item.column_type_id)+'\n');
  })
}

function getComuns(tableId) {
  let result = new Array();
  const column = new SimpleRecord('sys_db_column');
  const tableIds = getParentTableIds(tableId);
  column.addQuery('table_id', 'in', tableIds);
  column.selectAttributes(['sys_id', 'column_name', 'column_type_id']);
  column.query();
  while (column.next()) {
    result.push({sys_id:column.sys_id,column_name:column.column_name,column_type_id:column.column_type_id});
  }
 
  return  result;
}

//получаем id референсной таблиц
function getTableIdByReference(tableId, columnName) {
  const column = new SimpleRecord('sys_db_column');
  const tableIds = getParentTableIds(tableId);
  column.addQuery('table_id', 'in', tableIds);
  column.addQuery('column_name', columnName);
  column.addQuery('column_type_id', '8'); //убеждаемся, что колонка имеет тип Referece
  column.selectAttributes(['sys_id', 'reference_id']);
  column.query();
  if (column.getRowCount()) {
    column.next();
    return column.getValue('reference_id');
  }
}

// получаем список id таблицы и ее родителей
function getParentTableIds(tableId) {
  const tableName = getTableNameById(tableId);
  const parentTables = new SimpleTable(tableName).getParentTables().map(({ sys_id }) => sys_id);
  parentTables.push(tableId);
  return parentTables;
}

function getTableIdByName(name) {
  const table = new SimpleRecord('sys_db_table');
  table.get('name', name);
  return table.sys_id;
}

function getTableNameById(id) {
  const table = new SimpleRecord('sys_db_table');
  table.get('sys_id', id);
  return table.name;
}

function getColumnTypeNameById(id) {
  const table = new SimpleRecord('sys_db_column_type');
  table.get('sys_id', id);
  return table.name;
}
1 лайк

Спасибо! Примерно так у меня и получилось.