Таблицы данных
Таблица данных является неиндексируемым упорядоченным массивом объектов, которые демонстрируют одинаковые свойства. Таблицы данных могут быть представлены на любом языке программирования. В ThingWorx Platform таблицы данных обычно используются в реализациях JavaScript и могут использоваться для представления входных и выходных значений для сервисов. Пакеты ThingWorx Edge SDK поддерживают таблицы данных.
Так как таблицы данных являются массивом объектов, их можно рассматривать как электронные таблицы, в которых элементы массива являются строками, а свойства каждого объекта в массиве являются столбцами. При использовании таблиц данных в пользовательском сервисе или приложении важно, чтобы у каждого объекта имелись одинаковые свойства для сопоставления каждого столбца таблицы со значением свойства.
Как работают массивы в JavaScript?
ThingWorx позволяет использовать JavaScript для создания пользовательских сервисов с помощью таблиц данных для входных и выходных данных. Массивы работают в ThingWorx так же, как в JavaScript. В этом разделе приводятся основные сведения о работе с массивами.
Для объявления массива можно использовать следующие операторы.

var myArray=new Array();
var mySecondArray=[];
Оба приведенных выше оператора эквивалентны. Они оба создают объекты массива. Массив может содержать несколько объектов в последовательности любого типа. Например:
var myArrayOfStuff=[“Pickel”,3,{name:”Bill”,phone:”555-555-1212”}];
Приведенный выше массив содержит строку, число и пользовательский объект с полями name и phone. Чтобы проверить это, используйте браузер Chrome и откройте консоль JavaScript (CTRL+SHIFT+J). Затем вставьте приведенную выше строку, чтобы создать массив, и выполните следующие примеры, чтобы получить доступ к элементам массива. Ниже приведен снимок экрана консоли JavaScript в Chrome, показывающий, как создать каждый из объектов и получить доступ к нему в массиве JavaScript.
В строке 2 выше значение undefined не является ошибкой. Хотя объявление переменной в локальной контекстной области (var) возвращает в результате неопределенный объект, при этом создается переменная.
Чем таблица данных отличается от массива?
В приведенном выше примере массив JavaScript содержит совершенно разные типы объектов. Таблицы данных могут содержать только один тип объекта. Этот тип определяется не с помощью собственного механизма типизации объектов JavaScript, а с помощью другого конкретного определения типов ThingWorx, которое называется структурой данных. JavaScript рассматривает каждый тип объекта, который хранится в таблице данных, как тип Object, что можно видеть выше, когда команда myArrayOfStuff[2] выводится на печать. Таблицы данных требуют, чтобы каждый объект в массиве предоставлял одни и те же свойства.
Что такое структура данных?
Структура данных является спецификацией требуемых имен свойств и типов возврата, которые должны добавляться в таблицу данных в каждое свойство объекта. Структуры данных также содержат другие метаданные: свойства, которые полезны для форматирования и отображения таблицы данных в формате таблицы или сетки. Можно объявлять структуры данных в приложении ThingWorx Edge SDK и в ThingWorx Composer. Структуры данных требуются для построения функциональной таблицы данных. Фактически они являются механизмом схемы для определения обязательных полей вещи в ThingWorx. Дополнительные сведения о структурах данных см. в разделе Структуры данных.
Использование таблицы данных с сервисом
Пакет ThingWorx Edge Java SDK содержит инструменты для построения таблиц данных, необходимых для вызова сервисов. Этот пакет SDK предоставляет основу для демонстрации возможностей использования таблицы данных с сервисом. Обратите внимание, что INFOTABLE является одним из базовых типов ThingWorx. В частности, это агрегированный базовый тип.
Сервисы имеют аргументы и возвращаемые значения, выраженные с помощью элементарных типов, таких как строка, целое число, число и логическое значение. Таблицу данных можно использовать для описания набора аргументов сервиса. Параметры и возвращаемые значения сервиса могут быть переданы и получены как таблицы данных, содержащие одну или несколько строк.
При использовании в приложении ThingWorx Edge Java SDK в таблице данных имеется элемент DataShapeDefinition, описывающий имена, базовые типы и дополнительную информацию о каждом поле в таблице. Данные в таблице данных содержатся в строках. Каждая строка может содержать одно или несколько полей, описанных в элементе DataShapeDefinition таблицы данных. Ниже приведен пример определения таблицы данных с ее структурой данных и строками:
В дополнение к использованию таблиц данных с сервисами можно использовать таблицы данных для хранения данных для события или значений, возвращаемых запросом на чтение для нескольких свойств. Таблица данных может содержать одну или несколько строк. При возвращении результатов необходимо извлечь значения из каждой строки, используя методы Java SDK getFirstRow(), getSecondRow() и т. д. Также используется вспомогательная функция, соответствующая базовому типу поля, например getStringValue().
Ниже приведен пример использования таблицы данных для возвращения результатов чтения свойства:
// Define result as an InfoTable
InfoTable result
// Reading the "name" property of a Thing and
// extracting the results from an InfoTable
// Since "name" is a STRING, use getStringValue()
// to return the value of the "name" property.
result = client.readProperty(ThingworxEntityTypes.Things,
ThingName, "name", 10000);
String name = result.getFirstRow().getStringValue("name");
Дополнительные сведения о работе со структурами данных и таблицами данных с ThingWorx Edge Java SDK см. в разделе http://support.ptc.com/help/thingworx_hc/thingworx_edge_sdks_ems/#page/thingworx_edge_sdks_ems%2Fjava_sdk%2Fc_javasdk_data_shapes.html.
В ThingWorx 8.5.6 и более поздних версиях для обновления значений полей для одной или нескольких строк таблиц данных создайте локальную переменную, выполните операцию таблицы данных, а затем снова задайте для нее значение свойства вещи таблицы данных.
var tempInfoTable = me.infoTableProperty;
tempInfoTable.AddRow(row);
me.infoTableProperty = tempInfoTable;
Ссылка на свойство таблицы данных в пользовательском сервисе
Существует два способа доступа к свойству таблицы данных с помощью ключевого слова "me". Первым вариантом является использование метода, который позволяет использовать прямую ссылку на объект в свойстве таблицы данных. Второй способ заключается в использовании метода, который ссылается только на значение. Важно понимать различия, чтобы избежать повреждения данных, которое может быть результатом выполнения прямой привязки. В этом разделе описаны обе возможности.
* 
При наличии других интерфейсов API, которые можно использовать для получения значения свойства в пользовательском сервисе, целью этого раздела является описание действий при использовании ключевого слова me.
Первый метод допускает использование прямой ссылки на объект в этом свойстве таблицы данных. Любые изменения, внесенные в строку, будут отражены непосредственно в этом свойстве. Любые изменения, внесенные в поле, будут ограничены и должны выполняться с помощью другого метода, явно изменяющего структуру данных, на которую ссылается свойство таблицы данных. Прямая ссылка на объект может быть выполнена, как в следующем примере:
// Get a direct reference to the infoTableProperty on the entity
var infoTableProperty = me.infoTableProperty;
// Create a new NamedVTQ entry object to add to the infotable
var newEntry = new Object();
newEntry.name = "TemperatureReading"; // STRING [Primary Key]
newEntry.time = Date.now(); // DATETIME
newEntry.value = 98.6; // VARIANT
newEntry.quality = "GOOD"; // STRING
// Add the newEntry object as a new row to the infotable property
infoTableProperty.AddRow(newEntry);
// At this point, the property on the entity has a new row added to it
Свойство с именем infoTableProperty для вещи будет назначено непосредственно переменной tempTable. Любые изменения, внесенные в tempTable, будут снова отражаться в infoTableProperty. Следует помнить, что если несколько сервисов, обращающихся к этому свойству, выполняются одновременно, то результаты могут быть неожиданными при просмотре этого свойства таблицы данных. Самым безопасным способом изменить свойство таблицы данных, чтобы гарантировать, что значение свойства будет задано равным ожидаемому значению, является второй метод.
Второй метод ссылается только на значение, а не на фактический объект свойства. При ссылке только на значение все изменения, внесенные в строки или поля, будут приниматься, но не будут отражаться непосредственно в свойстве. Ссылку только на значение свойства таблицы данных можно выполнить с помощью API-сервиса Clone:
var params = {
t1: me.infoTableProperty /* INFOTABLE */
};
// result: INFOTABLE
var infoTableProperty = Resources["InfoTableFunctions"].Clone(params);
// NamedVTQ entry object
var newEntry = new Object();
newEntry.name = "TemperatureReading"; // STRING [Primary Key]
newEntry.time = Date.now(); // DATETIME
newEntry.value = 98.6; // VARIANT
newEntry.quality = "GOOD"; // STRING
// Add the newEntry object as a new row to the infotable property
infoTableProperty.AddRow(newEntry);
// At this point, you'll need to set the cloned table back to the infoTableProperty on the entity if you want the row to be added
me.infoTableProperty = infoTableProperty;
// Can also return the clone if desired
var result = infoTableProperty;
Использование базовых типов VEC
При использовании свойств с базовым типом VEC2, VEC3 или VEC4 нельзя задавать значения координат в пользовательском сервисе с помощью методов setX() или setY(). Чтобы задать значения координат, необходимо задать JSON как значение свойства, например {"x": 2, "y": 4}. Нельзя использовать точечную нотацию, например .x = 2 или .y = 4.