Personalización de Operator Advisor > Extensión del modelo de datos del Operator Advisor > Adición de entidades personalizadas al modelo de datos de Operator Advisor
Adición de entidades personalizadas al modelo de datos de Operator Advisor
La adición de entidades nuevas al modelo de datos de Operator Advisor implica varios pasos:
Crear una definición de datos para la nueva entidad
Para crear una definición de datos para la nueva entidad, complete los siguientes pasos:
1. En ThingWorx Composer, cree una nueva definición de datos. Para este ejemplo, asigne un nombre a la definición de datos MyObject.
2. En Definiciones de campo, pulse en Añadir y especifique nuevas definiciones de campo para cada propiedad que se debe incluir en la definición de datos.
a. Para designar un campo como clave principal, seleccione la casilla Es clave principal para ese campo.
b. Defina el Tipo base del campo de clave principal en LONG. Si el campo de clave principal es un tipo de datos LONG, los valores de este campo se generan automáticamente y la lógica para aumentar el valor se controla mediante la base de datos. Si se selecciona un Tipo base diferente, se debe gestionar la lógica para la exclusividad de la clave principal.
Para alinearse con el modelo de datos de Operator Advisor, añada un campo UID, con un Tipo base de LONG y la casilla Es clave principal seleccionada.
3. Pulse en Guardar para guardar la nueva definición de datos.
* 
Cuando se crea la tabla de base de datos para la definición de datos, el nombre de la tabla de base de datos es el nombre de la definición de datos, excepto cualquier prefijo, en minúsculas. Por ejemplo, si la definición de datos se denomina ABC.MyObject, el nombre de tabla de base de datos es myobject. Puesto que los prefijos no se incluyen en los nombres de la tabla de base de datos, no se soportan varios nombres de definición de datos que produzcan los mismos nombres de la tabla de base de datos, tales como ABC.MyObject y PTC.SCA.SCO.MyObject.
Del mismo modo, los nombres de columna de la tabla de base de datos son los nombres de campo de la definición de datos en minúsculas. Por ejemplo, un campo denominado MyPrimaryLocation genera una columna denominada myprimarylocation. Como resultado, los nombres de campo con las mismas letras pero con mayúsculas diferentes, como MyName, myName y myname, no se soportan en la misma definición de datos.
Actualizar la información de la base de datos para incluir la nueva definición de datos
Actualice la información de la base de datos para incluir la nueva definición de datos. Para ello, se puede añadir la información de la base de datos al servicio Get<entity>DBInfo existente para la entidad del modelo de datos a la que pertenece lógicamente la nueva entidad, o bien mediante la creación de un nuevo servicio Get<entity>DBInfo para la entidad. Por ejemplo, si la nueva entidad es lógicamente una parte del esquema de base de datos de órdenes de trabajo, añada la información de la base de datos para la nueva definición de datos al servicio GetJobOrderDBInfo.
Si se elige crear un administrador personalizado para la nueva entidad, se debe crear un nuevo servicio Get<entity>DBInfo para la entidad.
Adición de la información de la base de datos a un servicio existente
Para añadir la información de la base de datos para la nueva definición de datos a un servicio Get<entity>DBInfo existente:
1. Navegue al administrador de órdenes de producción por defecto (PTC.SCA.SCO.DefaultProductionOrderManager).
2. En Servicios, navegue hasta el servicio Get<entity>DBInfo para la entidad y sustitúyalo. Por ejemplo, el servicio GetJobOrderDBInfo o el servicio GetWorkDefinitionDBInfo.
3. En el editor de scripts, añada una entrada para la nueva definición de datos como una matriz, de forma similar a las entradas de definición de datos existentes. Incluya la información de la base de datos para su definición de datos:
dataShapeName: nombre de la definición de datos para la que se añade la nueva tabla de base de datos.
indexedFields: columnas que se van a indexar. La indexación ayuda a realizar búsquedas y clasificaciones más rápidas. Se pueden definir varios campos indexados en una matriz. Cada elemento de la matriz puede contener las siguientes propiedades:
name: (obligatorio) nombre de la columna.
unique: permite especificar si la columna debe tener un valor único.
identifier: el nombre de la entidad en la base de datos. Si no se especifica, el sistema genera automáticamente el valor con el formato <nombre_tabla>_<nombre_de_la_columna>_idx. Si se especifica, el valor debe ser único para los dos valores especificados como para los valores generados automáticamente. La longitud máxima del valor es la longitud máxima permitida por la base de datos para los identificadores.
fields: cualquier columna para la que sea necesaria una especificación adicional. Se pueden definir varios campos en una matriz. Cada elemento de la matriz puede contener las siguientes propiedades:
name: nombre de la columna. Obligatorio.
length: longitud de la columna, si la columna es un String, y se necesita una longitud distinta de la longitud por defecto de la base de datos.
notNull: permite especificar si la columna no debe ser nula.
* 
Si una columna debe tener un valor único, se debe especificar mediante unique en la matriz indexedFields, en lugar de hacerlo en la matriz fields.
foreignKeys: cualquier definición de columna de clave externa para la nueva tabla de base de datos. Se pueden definir varias claves externas en una matriz. Cada elemento de la matriz debe contener las siguientes propiedades:
name: nombre de la columna de la definición de datos actual para que sea una clave externa.
referenceDataShapeName: definición de datos de la tabla de base de datos a la que se hace referencia.
referenceFieldName: nombre del campo que contiene el valor al que se hace referencia.
identifier: el nombre de la entidad en la base de datos. Si no se especifica, el sistema genera automáticamente el valor con el formato <nombre_tabla>_<nombre_de_la_columna>_fk. Si se especifica, el valor debe ser único para los dos valores especificados como para los valores generados automáticamente. La longitud máxima del valor es la longitud máxima permitida por la base de datos para los identificadores.
onDelete: lo que ocurre, en caso de que suceda algo, a las instancias de la definición de datos actual cuando se borran instancias de la definición de datos de referencia.
deleteReference: lo que ocurre, en caso de que suceda algo, a las instancias de la definición de datos de referencia cuando se borran instancias de la definición de datos actual.
Para obtener más información sobre los comportamientos de borrado, consulte Definición del comportamiento de borrado con claves externas.
Por ejemplo, para que la nueva definición de datos MyObject no tenga campos indexados, tanga una clave externa, y defina la longitud del campo Location en 4000 caracteres, introduzca lo siguiente:
{
"dataShapeName": "MyObject",
"indexedFields": [],
"foreignKeys": [{"name":"WorkDefinitionUID", "referenceDataShapeName":"PTC.SCA.SCO.WorkDefinition", "referenceFieldName":"UID"}],
"fields": [
{
"name": "Location",
"length": 4000
}
]
}
4. Pulse en Terminado y, a continuación, en Guardar para guardar el servicio actualizado.
Creación de un nuevo servicio para obtener información de la base de datos
Para crear un nuevo servicio y obtener la información de la base de datos para su definición de datos:
1. Vaya al administrador de órdenes de producción por defecto (PTC.SCA.SCO.DefaultProductionOrderManager) o al administrador personalizado para la entidad si se ha creado una.
2. En Servicios, pulse en Añadir para añadir un nuevo servicio. Asigne un nombre al servicio Get<entity>DBInfo, reemplazando <entidad> por el nombre de su definición de datos. Por ejemplo, GetMyObjectDBInfo.
3. Defina el tipo de salida para el servicio en JSON.
4. Mediante uno de los servicios Get<entity>DBInfo existentes como modelo, introduzca la información de la base de datos para su definición de datos. Consulte el paso c de la sección anterior para ver la información de la base de datos que se debe especificar.
5. Pulse en Terminadoy, a continuación, en Guardar para guardar el nuevo servicio.
6. Sustituya y edite el servicio GetDBInfo.
7. En el editor de scripts, añada una entrada para el nuevo servicio.
Por ejemplo, si se está reemplazando el servicio GetDBInfo en el administrador de órdenes de producción por defecto, se debe añadir una entrada para el servicio GetMyObjectDBInfo similar a la siguiente:
Array.prototype.push.apply(dbInfo.dbInfo, me.GetMyObjectDBInfo().dbInfo);
Por ejemplo, si se está reemplazando el servicio GetDBInfo en un administrador personalizado, se debe añadir una entrada para el servicio GetMyObjectDBInfo de modo que el código de servicio aparezca de manera similar al siguiente:
var dbInfo = {
dbInfo: []
};
Array.prototype.push.apply(dbInfo.dbInfo, me.GetMyObjectDBInfo().dbInfo);
var result = dbInfo;
8. Pulse en Terminado y, a continuación, en Guardar para guardar el servicio actualizado.
Crear servicios CRUD
Cree los servicios CRUD necesarios para gestionar las instancias de la nueva definición de datos.
1. Vaya al administrador de órdenes de producción por defecto (PTC.SCA.SCO.DefaultProductionOrderManager) o al administrador personalizado para la entidad si se ha creado una.
2. En Servicios, pulse en Añadir y cree los servicios necesarios. Utilice los servicios CRUD existentes para las entidades de Operator Advisor como modelos.
Un servicio de creación:
Introduzca un nombre de servicio. Para este ejemplo, introduzca CreateMyObjects.
Para la entrada de servicio, añada una entrada denominada MyObjects, con un Tipo base de INFOTABLE. Para Definición de datos, seleccione su definición de datos.
Para la salida del servicio, seleccione INFOTABLE y elija su definición de datos.
En el panel de scripts, introduzca un código similar al siguiente:
var insertParams = {
infoTable: MyObjects,
dataShapeName: "MyObject"
};
var result = Things[me.GetDatabaseThingName()].Insert(insertParams);
Un servicio de borrado:
Introduzca un nombre de servicio. Para este ejemplo, introduzca DeleteMyObject.
Para la entrada de servicio, añada una entrada denominada UID, con un Tipo base de STRING.
Para la salida del servicio, seleccione INFOTABLE y elija su definición de datos.
En el panel de scripts, introduzca un código similar al siguiente:
var params = {
UID: UID,
dataShapeName: "MyObject"
};
var result = Things[me.GetDatabaseThingName()].Delete(params);
Un servicio de actualización:
Introduzca un nombre de servicio. Para este ejemplo, introduzca UpdateMyObjects.
Para la entrada de servicio, añada una entrada denominada MyObjects, con un Tipo base de INFOTABLE. Para Definición de datos, seleccione su definición de datos.
Para la salida del servicio, seleccione INFOTABLE y elija su definición de datos.
En el panel de scripts, introduzca un código similar al siguiente:
var params = {
infoTable: MyObjects,
dataShapeName: "MyObject"
};
var result = Things[me.GetDatabaseThingName()].Update(params);
Un servicio para recuperar una instancia individual de esta definición de datos:
Introduzca un nombre de servicio. Para este ejemplo, introduzca GetMyObject.
Para la entrada de servicio, añada una entrada denominada UID, con un Tipo base de STRING.
Para la salida del servicio, seleccione INFOTABLE y elija su definición de datos.
En el panel de scripts, introduzca un código similar al siguiente:
var params = {
UID: UID,
dataShapeName: "MyObject"
};
var result = Things[me.GetDatabaseThingName()].GetEntity(params);
Un servicio para recuperar varias instancias de esta definición de datos, incluyendo opcionalmente los parámetros de entrada de filtro, desvío y límite. Si no se especifican parámetros de entrada, se devuelven todas las instancias de MyObject:
Introduzca un nombre de servicio. Para este ejemplo, introduzca GetMyObjects
Para la entrada de servicio:
Añada una entrada denominada filter con un Tipo base de JSON.
Añada una entrada denominada offset con un Tipo base de INTEGER.
Añada una entrada denominada limit con un Tipo base de INTEGER.
Para la salida del servicio, seleccione INFOTABLE y elija su definición de datos.
En el panel de scripts, introduzca un código similar al siguiente:
var params = {
filter: filter,
dataShapeName: "MyObject",
offset: offset,
limit: limit
};
var result = Things[me.GetDatabaseThingName()].Query(params);
3. Pulse en Guardar para guardar los nuevos servicios en el administrador de órdenes de producción por defecto (PTC.SCA.SCO.DefaultProductionOrderManager).
4. En Configuración, añada una entrada para la nueva definición de datos y el nuevo servicio de creación a la tabla ServiceConfigurationSettings. Esto permite crear instancias de la nueva definición de datos mediante el servicio de creación cuando los datos se importan en el Operator Advisor. Cada definición de datos debe especificarse solo una vez en esta tabla de configuración.
Para obtener más información, consulte Importación de datos de otros sistemas.
Sincronizar la información de base de datos y el esquema de base de datos
Añada la nueva entidad a la base de datos mediante la sincronización de la información de la base de datos con el esquema de base de datos. Para obtener más información, consulte Sincronización de la información de base de datos y el esquema de base de datos.